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

效果

代码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>  // cvtColorint 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这个demoint 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 近似算法// 查找contourcv::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;
}

转载于:https://www.cnblogs.com/oloroso/p/8721994.html

OpenCV学习代码记录——轮廓(contour)检测相关推荐

  1. opencv学习—简单方法用于斑马线检测(Python)

    opencv学习-简单方法用于斑马线检测(Python) 目录 opencv学习-简单方法用于斑马线检测(Python) 1.读取原图像并将图像灰度化 2.通过高斯滤波去除噪声信息 3.阈值分割 4. ...

  2. opencv学习十六:圆检测

    圆检测 原理 圆周上任意三点所确定的圆,经Hough变换后在三维参数空间应对应一点.遍历圆周上所有点,任意三个点所确定的候选圆进行投票.遍历结束后,得票数最高点(理论上圆周上任意三点确定的圆在Houg ...

  3. 【opencv学习】【轮廓检测】

    今天学习轮廓检测方法 import cv2 import numpy as np# 展示图像,封装成函数 def cv_show_image(name, img):cv2.imshow(name, i ...

  4. OpenCV学习之寻找轮廓实现视频流的运动目标检测

    //寻找轮廓实现视频流的运动目标检测 #include "cv.h" #include "highgui.h" #include "time.h&qu ...

  5. 【opencv学习】【hough圆检测】

    import cv2 import numpy as np# 圆的检测原理 # 霍夫梯度法:先确定圆心,再确定半径 # 把原图做一次 Canny 边缘检测,得到边缘检测的二值图. # 圆的边缘点切线的 ...

  6. 【opencv学习】【运动物体检测】

    今天学习运动物体检测 一:帧差法 捕获摄像头的运动的手 import cv2 import numpy as np# 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为 ...

  7. 【OpenCV学习】基于轮廓寻找的视频流运动检测

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ #include "cv.h" #include "highgui.h" ...

  8. 【opencv 学习笔记】harris焦点检测和原理学习笔记

    参考博客: 1.https://blog.csdn.net/with__sunshine/article/details/88954489 2.https://www.cnblogs.com/djrc ...

  9. cocos2dx 学习代码记录

    看一个连连看的代码.里面有一些不熟悉的地方,需要查看,随手记录下.备忘 1 CREATE_FUNC宏 在代码里经常看到使用这个宏: CREATE_FUNC(BaseLayer); 1 /** 2 * ...

最新文章

  1. 解析Shell编程中的-----“去重“
  2. RHEL各版本的XManager4远程配置
  3. 疾病预测和天气分析练习赛
  4. Swift学习笔记-访问控制(Access Control)
  5. java自定义异常实验总结,Java实验--自定义异常的使用
  6. 计算机网络之网络层:5、DHCP协议、ICMP协议、网络地址转换NAT
  7. C++虚函数与纯虚函数用法与区别
  8. Page_PreInit在网页传值的应用
  9. 实训笔记20190807--数据分析
  10. 第三周助教工作总结——NWNU李泓毅
  11. MyBatis choose标签
  12. 新手上路参考驾驶手册 36计教你安全上路(收集)
  13. 用Python玩转二维码
  14. 如何使用python读取excel表的某一列_使用python采集Excel表中某一格数据
  15. golang调用sdl2,键盘和鼠标事件
  16. PS(简单操作) 单张图片制作九宫格/证件照排版
  17. win7右下角的网络图标不显示
  18. MySQL-redo和undo
  19. 企业微信推送消息延迟_微信接收消息总是延迟?没有提醒,这3个功能赶紧设置一下...
  20. lt;=gt;与lt;gt;的区别

热门文章

  1. mysql 删表卡死_如何解决mysql 删表卡住的问题
  2. 超级玛丽制作揭秘13小怪和火圈,模板
  3. 当指针邂逅函数,绚烂的花朵因此而绽放
  4. 配置HylaFAX传真服务器
  5. ROBOT IN!英特尔智能机器人创新应用2021正式启动
  6. 免费IP归属地查询接口
  7. 华为OD机试 - 简易压缩算法(Python) | 机试题+算法思路+考点+代码解析 【2023】
  8. Mixly19:光控小夜灯
  9. JetPack4.2.2系统上修改TX2配置为配置3
  10. CREATE TABLE 表名 AS SELECT 语句 创建表(转载的非原创)转载自CSDN