很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。

代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest

效果

代码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> // cvtColor int contours_test(); int ContourDetection()
{ //return contours_test();
cv::Mat image; // 加载原始图片
cv::Mat gary; // 存储灰度图像
cv::Mat dstimg; // 绘制轮廓目标图片 // 创建两个窗口
cv::namedWindow("src"); // 原始图片显示窗口
cv::namedWindow("dst"); // 轮廓图片显示窗口 // 载入原始图片
image = cv::imread("../Image/sisy.jpg");
if (image.empty()) {
puts("图片加载失败");
return -1;
}
cv::imshow("src", image); // 显示原始图片 gary.create(image.size(), CV_8U); // 申请灰度图存储空间
cv::cvtColor(image, gary, CV_BGR2GRAY); // 转换原始图为灰度图
cv::threshold(gary, gary, 128, 255, cv::THRESH_BINARY); // 转换为二值图 std::vector<std::vector<cv::Point> > contours; // 检测的轮廓数组
std::vector<cv::Vec4i> hierarchy; //
int mode = CV_RETR_EXTERNAL; // 轮廓检测模式
//mode表示轮廓的检索模式
// CV_RETR_EXTERNAL表示只检测外轮廓
// CV_RETR_LIST检测的轮廓不建立等级关系
// CV_RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
// CV_RETR_TREE建立一个等级树结构的轮廓。具体参考contours.c这个demo int method = CV_CHAIN_APPROX_SIMPLE;
//method为轮廓的近似办法
// CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1 - x2),abs(y2 - y1)) == 1
// CV_CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
// CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法 // 查找contour
cv::findContours(gary/*输入图像(必须为一个2值单通道图像)*/,
contours/*, hierarchy*/, mode, method); // 为轮廓显示图片申请空间
dstimg = cv::Mat(image.size(), CV_8UC3); // 3通道图像,以便彩色显示
image.copyTo(dstimg); // 拷贝源图像 // 将轮廓画出
cv::drawContours(dstimg/*目标图像*/,
contours/*输入的轮廓组*/,
-1 /*指明画第几个轮廓(负值表示全部轮廓)*/,
cv::Scalar(0,0,255)/*轮廓颜色BGR(此处以红色绘制)*/,
2 /*轮廓线宽*/,
8 /*轮廓线型*/,
cv::noArray()/*轮廓结构信息*/); // 显示轮廓图片
cv::imshow("dst", dstimg); // 等待按键
cv::waitKey();
} int contours_test()
{
std::string image_name = "../Image/sisy.jpg"; cv::Mat src = cv::imread(image_name);
cv::imshow("src", src); cv::Mat gray(src.size(), CV_8U);
cv::cvtColor(src, gray, CV_BGR2GRAY);//转换成灰度图 cv::imshow("gray", gray); cv::threshold(gray, gray, 128, 255, cv::THRESH_BINARY);//转换成2值图像
cv::imshow("binary", gray); /////////////////////////////////////////////////////////////////////
std::vector<std::vector<cv::Point>> contours;
cv::findContours(gray,
contours, // a vector of contours
CV_RETR_EXTERNAL, // retrieve the external contours
CV_CHAIN_APPROX_NONE); // retrieve all pixels of each contours // Print contours' length
// std::cout << "Contours: " << contours.size() << std::endl;
std::vector<std::vector<cv::Point>>::const_iterator itContours = contours.begin();
for (; itContours != contours.end(); ++itContours)
{ //std::cout << "Size: " << itContours->size() << std::endl;
} // draw black contours on white image
cv::Mat result(gray.size(), CV_8U, cv::Scalar(255));
cv::drawContours(result, contours,
-1, // draw all contours
cv::Scalar(0), // in black
2); // with a thickness of 2 cv::namedWindow("Contours");
cv::imshow("Contours", result); // draw contours on the original image
cv::Mat original = cv::imread(image_name);
cv::drawContours(original, contours,
-1, // draw all contours
cv::Scalar(255, 255, 255), // in white
-1); // with a thickness of 2 cv::namedWindow("Contours on Animals");
cv::imshow("Contours on Animals", original); // Let's now draw black contours on white image
result.setTo(cv::Scalar(255));
cv::drawContours(result, contours,
-1, // draw all contours
cv::Scalar(0), // in black
-1); // with a thickness of 1
//image= cv::imread("test.png",0); cv::waitKey(0); return 0;
}

OpenCV学习代码记录——轮廓(contour)检测的更多相关文章

  1. OpenCV学习代码记录——Hough线段检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  2. OpenCV学习代码记录—— Snake轮廓

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  3. OpenCV学习代码记录——人脸检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  4. OpenCV学习代码记录——canny边缘检测

    很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...

  5. OpenCV学习(34) 点到轮廓的距离

    在OpenCV中,可以很方便的计算一个像素点到轮廓的距离,计算距离的函数为: double pointPolygonTest(InputArray contour, Point2f pt, bool ...

  6. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  7. OpenCV学习(32) 求轮廓的包围盒

    在OpenCV中,能够很方便的求轮廓包围盒.包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒.用到的四个函数是: Rect boundingRect(InputArray points) ...

  8. OpenCV学习笔记(14)——轮廓的性质

    提取一些经常使用的对象特征 1.长宽比 边界矩形的宽高比                                       x,y,w,h = cv2.boundingRect(cnt) a ...

  9. python 设计模式学习代码记录

    @工厂模式class Beijing: def printreslut(self): print("ok") class Shanghai: def printreslut(sel ...

随机推荐

  1. Guava CharMatcher

    概述 CharMatcher提供了多种对字符串处理的方法, 它的主要意图有: 1. 找到匹配的字符 2. 处理匹配的字符 CharMatcher内部主要实现包括两部分: 1. 实现了大量公用内部类, ...

  2. 连接sqlServer数据库&jpa调用存储过程Java获取存储过程返回的多个结果集JAVA调用sqlserver存储过程的实现(返回多个结果集的实现)jdbc多结果集(getMoreResults)

    存储过程: BEGIN select * from teacher; SELECT * FROM student; END public Object GetMyBOProjectProductLis ...

  3. go语言之进阶篇Read的使用

    1.read的使用(备注:读文件) 示例: package main import ( "fmt" "io" "os" ) func Wri ...

  4. Neo4j 2.0 生产环境集群搭建

    一.在windows上搭建Neo4j ha cluster的配置方法: 例如:建立集群的三台机器的ip分别为:10.230.9.91,10.230.9.92,10.230.9.93. 10.230.9 ...

  5. Gridview 单选效果实现,且用且珍惜

    Gridview 单选效果,在androidapp中实现非常频繁,我这里提供我的一种思路,这是我的思维导图: 怎么样将这样的思维导图翻译成java代码了,请看下面的代码了: // 电子产品的图片列表信 ...

  6. Spring(八):Spring配置Bean(一)BeanFactory&ApplicationContext概述、依赖注入的方式、注入属性值细节

    在Spring的IOC容器里配置Bean 配置Bean形式:基于xml文件方式.基于注解的方式 在xml文件中通过bean节点配置bean: <?xml version="1.0&qu ...

  7. Cognos11中通过URL传参访问动态Report

    一.需求: 在浏览器输入一个URL,在URL后面加上参数就可以访问一个有提示值的报表?比如下面的报表 二.解决办法 Cognos  Model 查询主题设计层概要 Select * from [UCO ...

  8. 深浅拷贝 python

    原文:http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 ...

  9. mysqli

    CREATE TABLE `user` ( `id` ) NOT NULL, `name` ) NOT NULL, `password` ) NOT NULL ) ENGINE=InnoDB DEFA ...

  10. ASP入门(十五)- Global.asa

    Global.asa 文件是一个可选文件,它可包含被 ASP 应用程序中每个页面访问的对象.变量和方法的声明.所有合法的浏览器脚本都可以在 Global.asa 中使用. Global.asa 文件只 ...