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——C++版图像形状简单识别 -> 正文阅读

[人工智能]OPENCV——C++版图像形状简单识别

OPENCV——C++版图像形状简单识别

在这里插入图片描述

在这里插入图片描述
其实就是简单的小实验,识别图形,opencv的库里是有对应的函数。
首先可以勾勒出他们的轮廓,其次还可以识别哪些是三角形,哪些是圆形,哪些是矩形。

这就是形状、轮廓检测的功能。

预处理

1.灰度

cvtColor(img, imgGray,COLOR_BGR2GRAY, 0);

在这里插入图片描述
2.高斯滤波

GaussianBlur(imgGray, imgBlur, Size(65, 65), 1, 1);

在这里插入图片描述
3.Canny边缘检测

		Canny(imgBlur, imgCanny, 40, 120);

在这里插入图片描述
4.膨胀

		Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));

		dilate(imgCanny, imgDila, kernel);

在这里插入图片描述

形状与轮廓检测函数详解

这里我推荐这位博主的解释,很详尽。
计算机视觉 OpenCV【七:应用之形状与轮廓检测】

具体代码


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

using namespace cv;
using namespace std;


void getcontour(Mat imgDil,Mat img)//判断轮廓
{
	vector<vector<Point>> contour;
	vector<Vec4i> hierarchy;
	findContours(imgDil, contour, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_TC89_KCOS);
	
	vector<vector<Point>> conPoly(contour.size());
	vector<Rect> boundRect(contour.size());
	for (int i = 0; i < contour.size(); i++)
	{
		int area = contourArea(contour[i]);//轮廓面积用于排除黑点
		cout << area << endl;
		string objectType;//形状

		if (area > 1000)//排除小黑圆点的干扰
		{
			float peri = arcLength(contour[i], true);
			approxPolyDP(contour[i], conPoly[i], 0.02 * peri, true);//把一个连续光滑曲线折线化			
			cout << conPoly[i].size() << endl;//边数
			boundRect[i] = boundingRect(conPoly[i]);

			int objCor = (int)conPoly[i].size();
			if (objCor == 3) { objectType = "Tri"; }
			else if (objCor == 4) {
				float aspRatio = (float)boundRect[i].width / boundRect[i].height;//长宽比来区别正方形与矩形
				cout << aspRatio << endl;
				if (aspRatio > 0.95 && aspRatio < 1.05) { objectType = "Square"; }
				else { objectType = "Rect"; }
			}
			else if (objCor > 4) { objectType = "Circle"; }
			drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);
			rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0.255, 0), 5);//框出图形
			putText(img, objectType, { boundRect[i].x,boundRect[i].y - 5 },1,FONT_HERSHEY_PLAIN, Scalar(0, 69, 255), 1);
		}
	}
}
void main() {
	string path = "Resources/shapes.png";
		Mat img = imread(path);//读取图片
		Mat imgGray, imgBlur, imgCanny, imgDila, imgErode;
		Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
		//preprocessing
		cvtColor(img, imgGray,COLOR_BGR2GRAY, 0);
		GaussianBlur(imgGray, imgBlur, Size(65, 65), 1, 1);
		Canny(imgBlur, imgCanny, 40, 120);
		dilate(imgCanny, imgDila, kernel);
//灰度->高斯滤波->Canny边缘算法->膨胀
		getcontour(imgDila,img);
	    imshow("Image", img);
	//imshow("Image Gray", imgGray);
	//imshow("Image Blur", imgBlur);
	//imshow("Image Canny", imgCanny);
	//imshow("Image dila", imgDila);
	waitKey(0);
}

窗口里显示了面积,边数,长宽比。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

效果还是不错的

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:05:19  更:2021-08-29 09:06:11 
 
开发: 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/1 12:26:35-

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