IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCv学习笔记1-轮廓检测 -> 正文阅读

[人工智能]OpenCv学习笔记1-轮廓检测

OpenCv学习笔记1-轮廓检测


一、轮廓检测的基本原理

实现思路:通过找出在一张图片中满足特定像素值的像素点,实现轮廓绘制。

实验流程:
(1)颜色空间转换
(2)二值化处理
(3)腐蚀膨胀
(4)轮廓绘制

二、实验流程

1.颜色空间转换

实验第一步需要将RGB颜色空间转成HSV颜色空间,RGB对硬件友好,而HSV则对我们人眼友好,根据下面的表格我们可以得出需要的结果
在这里插入图片描述
例如我们如果想要框出这两车的车牌号,我们就可以直接用微信截图里的框(bushi),我们就可以把颜色为蓝色的点集寻找出来,使用阈值处理得到二值图

在这里插入图片描述

2.二值化处理

代码如下(示例):

// 转颜色空间

// 转颜色空间
	
	cvtColor(img, dst, CV_BGR2HSV);



	Mat dstImage;

	//二值化,+90为调整过后的参数,可以自行修改得到最佳值
	inRange(dst, Scalar(105, 53+90, 46), Scalar(114, 255, 255), dstImage);

3.腐蚀膨胀

腐蚀膨胀的主要作用就是去除噪声

腐蚀:遍历一个点周围的8个点,将当前点修改为周围点中的最小值
膨胀:遍历一个点周围的8个点,将当前点修改为周围点中的最大值
直接使用opencv中的现成库!

代码如下(示例):

// 转颜色空间


	//腐蚀膨胀
	Mat dstImage1_5;
	Mat element = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
	erode(dstImage, dstImage1_5, element, Point(-1, -1), 1, 0);

	Mat dstImage1_75;
	dilate(dstImage1_5, dstImage1_75, element, Point(-1, -1), 1);

前后效果图:
可以看出,左侧的噪声明显减少
在这里插入图片描述

4.轮廓绘制

第一步,找点集
我们在上面得到了二值图,即得到了想要部分(白色)和不想要部分,那么第二步,我们则需要找出边界的点集,使用以下函数即可

findContours(dstImage, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

第二步,找点集的外接矩形
在上面的函数处理后,返回的contours是一个点集,我们对这些点集直接使用下面函数寻找其外接矩形

  boundRect[i] = boundingRect(Mat(contours[i]));

对返回的多个矩形通过长宽进行筛选,最终得到正确结果

double wh = boundRect[i].width / boundRect[i].height;
				
			if(wh>2&& boundRect[i].height>20)

完整代码

#include<iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include<cstdlib>
#include<ctime>

using namespace std;
using namespace cv;


int main() {




	//定义变量
	
	Mat img;
	Mat dst;

	Mat result;

	//载入图片  

	img = imread("C:\\Users\\EDZ\\Desktop\\1.jpg");

	// 转颜色空间
	
	cvtColor(img, dst, CV_BGR2HSV);



	Mat dstImage;

	//二值化
	inRange(dst, Scalar(105, 53+90, 46), Scalar(114, 255, 255), dstImage);
	
	//腐蚀膨胀
	Mat dstImage1_5;
	Mat element = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
	erode(dstImage, dstImage1_5, element, Point(-1, -1), 1, 0);

	Mat dstImage1_75;
	dilate(dstImage1_5, dstImage1_75, element, Point(-1, -1), 1);



	//轮廓绘制
	

	vector<vector<Point>> contours;
	vector<Vec4i> hierarcy;
	findContours(dstImage, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
	vector<Rect> boundRect(contours.size());  //定义外接矩形集合
	vector<RotatedRect> box(contours.size()); //定义最小外接矩形集合
	Point2f rect[4];
	for (int i = 0; i < contours.size(); i++)
		{
		    box[i] = minAreaRect(Mat(contours[i]));  //计算每个轮廓最小外接矩形
		    boundRect[i] = boundingRect(Mat(contours[i]));
		       
		    box[i].points(rect);  //把最小外接矩形四个端点复制给rect数组

				

			double wh = boundRect[i].width / boundRect[i].height;
				
			if(wh>2&& boundRect[i].height>20){

		    rectangle(img, Point(boundRect[i].x, boundRect[i].y), Point(boundRect[i].x + boundRect[i].width, boundRect[i].y + boundRect[i].height), Scalar(0, 255, 0), 2, 8);
				for (int j = 0; j < 4; j++)
					{
						line(img, rect[j], rect[(j + 1) % 4], Scalar(0, 255, 0), 2, 8);  //绘制最小外接矩形每条边
					}
				}
				imshow("结果图", img);
		}


	/*通道统一
	Mat dstImage2;
	//cvtColor(dstImage1_75, dstImage2, COLOR_GRAY2BGR);
	cvtColor(dstImage, dstImage2, COLOR_GRAY2BGR);
	
	//掩码
	Mat r;
	bitwise_and(img2, dstImage2, r);*/


	//显示原图  

	namedWindow("Image");

	imshow("Image", img);

	// 显示二值图 

	namedWindow("二值化后的图像1");

	imshow("二值化后的图像1", dstImage);

	//腐蚀膨胀图
	namedWindow("腐蚀膨胀后的图像1");

	imshow("腐蚀膨胀后的图像1", dstImage1_75);

	//掩码图

	//namedWindow("掩码图");

	//imshow("掩码图", r);

	waitKey(0);






	
	

	return 0;
}

效果图:

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-09 17:32:00  更:2021-07-09 17:32:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:49:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码