OpenCV学习代码记录——轮廓(contour)检测
很久之前学习过一段时间的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)检测相关推荐
- opencv学习—简单方法用于斑马线检测(Python)
opencv学习-简单方法用于斑马线检测(Python) 目录 opencv学习-简单方法用于斑马线检测(Python) 1.读取原图像并将图像灰度化 2.通过高斯滤波去除噪声信息 3.阈值分割 4. ...
- opencv学习十六:圆检测
圆检测 原理 圆周上任意三点所确定的圆,经Hough变换后在三维参数空间应对应一点.遍历圆周上所有点,任意三个点所确定的候选圆进行投票.遍历结束后,得票数最高点(理论上圆周上任意三点确定的圆在Houg ...
- 【opencv学习】【轮廓检测】
今天学习轮廓检测方法 import cv2 import numpy as np# 展示图像,封装成函数 def cv_show_image(name, img):cv2.imshow(name, i ...
- OpenCV学习之寻找轮廓实现视频流的运动目标检测
//寻找轮廓实现视频流的运动目标检测 #include "cv.h" #include "highgui.h" #include "time.h&qu ...
- 【opencv学习】【hough圆检测】
import cv2 import numpy as np# 圆的检测原理 # 霍夫梯度法:先确定圆心,再确定半径 # 把原图做一次 Canny 边缘检测,得到边缘检测的二值图. # 圆的边缘点切线的 ...
- 【opencv学习】【运动物体检测】
今天学习运动物体检测 一:帧差法 捕获摄像头的运动的手 import cv2 import numpy as np# 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为 ...
- 【OpenCV学习】基于轮廓寻找的视频流运动检测
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ #include "cv.h" #include "highgui.h" ...
- 【opencv 学习笔记】harris焦点检测和原理学习笔记
参考博客: 1.https://blog.csdn.net/with__sunshine/article/details/88954489 2.https://www.cnblogs.com/djrc ...
- cocos2dx 学习代码记录
看一个连连看的代码.里面有一些不熟悉的地方,需要查看,随手记录下.备忘 1 CREATE_FUNC宏 在代码里经常看到使用这个宏: CREATE_FUNC(BaseLayer); 1 /** 2 * ...
最新文章
- 解析Shell编程中的-----“去重“
- RHEL各版本的XManager4远程配置
- 疾病预测和天气分析练习赛
- Swift学习笔记-访问控制(Access Control)
- java自定义异常实验总结,Java实验--自定义异常的使用
- 计算机网络之网络层:5、DHCP协议、ICMP协议、网络地址转换NAT
- C++虚函数与纯虚函数用法与区别
- Page_PreInit在网页传值的应用
- 实训笔记20190807--数据分析
- 第三周助教工作总结——NWNU李泓毅
- MyBatis choose标签
- 新手上路参考驾驶手册 36计教你安全上路(收集)
- 用Python玩转二维码
- 如何使用python读取excel表的某一列_使用python采集Excel表中某一格数据
- golang调用sdl2,键盘和鼠标事件
- PS(简单操作) 单张图片制作九宫格/证件照排版
- win7右下角的网络图标不显示
- MySQL-redo和undo
- 企业微信推送消息延迟_微信接收消息总是延迟?没有提醒,这3个功能赶紧设置一下...
- lt;=gt;与lt;gt;的区别
热门文章
- mysql 删表卡死_如何解决mysql 删表卡住的问题
- 超级玛丽制作揭秘13小怪和火圈,模板
- 当指针邂逅函数,绚烂的花朵因此而绽放
- 配置HylaFAX传真服务器
- ROBOT IN!英特尔智能机器人创新应用2021正式启动
- 免费IP归属地查询接口
- 华为OD机试 - 简易压缩算法(Python) | 机试题+算法思路+考点+代码解析 【2023】
- Mixly19:光控小夜灯
- JetPack4.2.2系统上修改TX2配置为配置3
- CREATE TABLE 表名 AS SELECT 语句 创建表(转载的非原创)转载自CSDN