c/c++语言开发共享C++ OpenCV实战之形状识别

前言本案例通过使用opencv中的approxpolydp进行多边形近似,进而进行基础形状识别(圆、三角形、矩形、星形…)。下面就一起来看看具体是如何实现的吧。一、图像预处理原图如图所示

前言

本案例通过使用opencv中的approxpolydp进行多边形近似,进而进行基础形状识别(圆、三角形、矩形、星形…)。下面就一起来看看具体是如何实现的吧。

一、图像预处理

原图如图所示:

C++ OpenCV实战之形状识别

首先第一步先进行图像预处理,得到二值图像。

	mat gray;  	cvtcolor(src, gray, color_bgr2gray);    	mat gaussian;  	gaussianblur(gray, gaussian, size(3, 3), 0);    	mat thresh;  	threshold(gaussian, thresh, 0, 255, thresh_binary_inv | thresh_otsu);  

C++ OpenCV实战之形状识别

结果如图所示。接下来,需要对此二值图像进行轮廓提取,进而识别物体形状。

二、形状识别

本案例使用approxpolydp进行形状识别,关于approxpolydp opencv给出的定义是:

void approxpolydp(inputarray curve, outputarray approxcurve, double epsilon, bool closed);

  • curve:表示输入轮廓点集,可以是 vector 或 mat 类型。
  • approxcurve:多边形逼近结果,存储在approxcurve数组中。curve和approxcurve应该属于同一类型。
  • epsilon:表示逼近准确度,你允许在原多边形和最终拟合的多边形之间存在的最大偏差。一般以其周长的百分比进行近似。
  • closed:指明curve中的一系列点是否是一个闭合的多边形。若设为true,则认为曲线是闭合的。

我们通过统计多边形的“边”数来识别物体形状。

三、源码

#include<iostream>  #include<opencv2/opencv.hpp>  using namespace std;  using namespace cv;    //基础几何形状识别  bool pattern_recognition(mat& src)  {  	//图像预处理  	mat gray;  	cvtcolor(src, gray, color_bgr2gray);    	mat gaussian;  	gaussianblur(gray, gaussian, size(3, 3), 0);    	mat thresh;  	threshold(gaussian, thresh, 0, 255, thresh_binary_inv | thresh_otsu);    	//轮廓查找  	vector<vector<point>>contours;//轮廓点集  	findcontours(thresh, contours, retr_external, chain_approx_simple);  	vector<vector<point>>conpoly(contours.size());//多边形逼近结果,与轮廓一一对应    	for (int i = 0; i < contours.size(); i++)  	{  		double area = contourarea(contours[i]); //轮廓面积    		if (area > 1000)  		{  			rect rect = boundingrect(contours[i]);//外界矩形    			double ratio = double(rect.width) / double(rect.height);//长宽比    			double peri = arclength(contours[i], true);//周长    			approxpolydp(contours[i], conpoly[i], 0.02 * peri, true);//多边形近似    			int objsize = conpoly[i].size();//折线数--通过判断轮廓有几条边来识别图形    			string objname;  			scalar color;  			if (objsize == 3)  			{  				objname = "triangle";//三角形  				color = scalar(0, 0, 255);  			}  			if (objsize == 4)  			{  				//通过长宽比判断正方形/长方形  				if (ratio > 0.99 && ratio < 1.01)  				{  					objname = "square";//正方形  					color = scalar(0, 255, 255);  				}  				else  				{  					objname = "rectangle";//长方形  					color = scalar(0, 255, 0);  				}  			}  			if (objsize == 8)  			{  				objname = "circle";//圆形  				color = scalar(255, 255, 0);  			}  			if (objsize == 10)  			{  				objname = "star";//星形  				color = scalar(255, 0, 255);  			}    			//效果绘制  			rectangle(src, rect, color, 2);  			puttext(src, objname, rect.tl(), font_hershey_simplex, 1, color, 2);  		}  	}    	return true;  }    int main()  {  	mat src = imread("src.jpeg");  	if (src.empty())  	{  		cout << "no image!" << endl;  		system("pause");  		return -1;  	}  	  	if (!pattern_recognition(src))return false;    	namedwindow("test", window_normal);  	imshow("test", src);  	waitkey(0);  	system("pause");  	return 0;  }  

四、结果显示

C++&nbsp;OpenCV实战之形状识别

总结

c/c++开发分享C++ OpenCV实战之形状识别使用opencv c++ 进行基础形状识别,其实原理很简单,主要操作有以下几点。

1、图像预处理

2、物体轮廓提取

3、使用approxpolydp进行多边形近似,进而统计出该物体的“边”数,从而识别出物体形状。

到此这篇关于c++ opencv实战之形状识别的文章就介绍到这了,更多相关c++ opencv形状识别内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++ OpenCV实战之形状识别,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1115600.html

(0)
上一篇 2022年7月10日
下一篇 2022年7月10日

精彩推荐