OpenCV在图像中寻找轮廓和计算图像中物体的凸包
2015-09-08 13:55
836 查看
一、轮廓的寻找
用于寻找的函数:
第一个参数为输入图像,要求为8位1通道。
第二个为用于输出的点的集合,应该为Point的向量。
第三个参数为可选输出向量,包含了图像的拓扑信息。
然后是用于绘图的函数:
具体用法和findContours对照即可,其中contourIdx参数为contours的索引,所以在循环中使用比较好。
具体代码:
二、凸包的计算
所使用的函数:
参数就是之前计算出的轮廓和用于输出的集合
具体代码:
效果图:
用于寻找的函数:
void findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
第一个参数为输入图像,要求为8位1通道。
第二个为用于输出的点的集合,应该为Point的向量。
第三个参数为可选输出向量,包含了图像的拓扑信息。
然后是用于绘图的函数:
void drawContours( InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point() );
具体用法和findContours对照即可,其中contourIdx参数为contours的索引,所以在循环中使用比较好。
具体代码:
int main() { RNG rng(12345); Mat a = imread("1RT05508-0.jpg"); imshow("原图", a); cvtColor(a, a, CV_RGB2GRAY); vector<vector<Point> > contours; vector<Vec4i> hierarchy; Canny(a, a, 100, 300); findContours(a, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE); Mat drawing = Mat::zeros(a.size(), CV_8UC3); Mat b = Mat::zeros(a.size(), CV_8UC3); for (int i = 0; i< contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(b, contours, i, color, 2, 8, hierarchy, 0); } imshow("效果图", b); cvWaitKey(10000); }
二、凸包的计算
所使用的函数:
void convexHull( InputArray points, OutputArray hull, bool clockwise = false, bool returnPoints = true );
参数就是之前计算出的轮廓和用于输出的集合
具体代码:
int main() { RNG rng(12345); Mat a = imread("9660416_102608612175_2.jpg"); imshow("原图", a); cvtColor(a, a, CV_RGB2GRAY); vector<vector<Point> > contours; vector<Vec4i> hierarchy; Canny(a, a, 100, 300); findContours(a, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE); vector<vector<Point> >hull(contours.size()); for (int i = 0; i < contours.size(); i++) //计算凸包 { convexHull(Mat(contours[i]), hull[i]); } Mat b = Mat::zeros(a.size(), CV_8UC3); for (int i = 0; i< contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(b, contours, i, color, 2, 8, hierarchy, 0); drawContours(b, hull, i, color, 1, 8, vector<Vec4i>(), 0); //绘制凸包 } imshow("效果图", b); cvWaitKey(10000); }
效果图:
相关文章推荐
- shell 打印偶数行-奇数行 ,打印行号
- Tomcat设置最佳线程数总结
- 全球顶级应用性能监控管理服务商分析
- 查看使用了那种shell
- LINUX 安装ftp
- NSRunLoop详解
- Linux expect 用法
- NSRunLoop的进一步理解
- Tomcat 粘性session
- centos6.5安装cmake
- Photoshop CS3(CS4)打开GIF格式只有一帧的解决办法
- 避免每次修改java代码tomcat都要重新启动的设置
- Apache实现限速(针对每个客户端限速)
- Linux中df和du的区别
- Linux 任务计划 at,cron
- 避免每次检索都使用DirectoryReader.open()
- hdu 4405 Aeroplane chess(概率+dp)
- Linux孤儿进程与僵尸进程
- [引] Security tips for web developers
- linux Ubuntu的root权限开通