【opencv】检测形状

1.图片预处理,提取边界
在这里插入图片描述

经过处理后的图片轮廓更加清晰。更有利于后续的操作。

2.findContours()查找轮廓,drawContours()画出轮廓
在这里插入图片描述

3.contourArea()计算每个轮廓的面积,通过if(area>2000)筛选出图形后再画出轮廓
在这里插入图片描述

通过面积大小,将噪声过滤

下面见代码示例:

#include<iostream>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

void getContours(Mat imgDil, Mat img)
{
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
    //找轮廓
	findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	//drawContours(img, contours, -1, Scalar(255, 0, 255), 2);//-1画出所有轮廓

	vector<vector<Point>> conPoly(contours.size());
	vector<Rect> boundRect(contours.size());
	string objectType;
	for (int i = 0; i < contours.size(); i++)
	{
		//取出每个轮廓的面积
		int area = contourArea(contours[i]);
		cout << area << endl;
		//过滤小面积
		if (area > 2000)
		{
			float peri = arcLength(contours[i], true);
			approxPolyDP(contours[i], conPoly[i], 0.02*peri, true);
            //画出轮廓
			drawContours(img, conPoly, i, Scalar(255, 0, 255), 3);
			cout << conPoly[i].size() << endl;

			boundRect[i] = boundingRect(conPoly[i]);
			rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 3);

			int objCor = (int)conPoly[i].size();
			if (objCor == 3)
			{
				objectType = "Tri";
			}
			else if (objCor == 4)
			{
				float aspRatio = (float)boundRect[i].width / (float)boundRect[i].height;
				if (aspRatio > 0.95 && aspRatio < 1.05)
				{
					objectType = "Square";
				}
				else
				{
					objectType = "Rect";
				}
				cout << aspRatio << endl;
			}
			else if (objCor > 4)
			{
				objectType = "Circle";
			}
			putText(img, objectType, { boundRect[i].x,boundRect[i].y - 5 }, FONT_HERSHEY_DUPLEX, 0.7, Scalar(0, 69, 255), 1);
		}
	}
}

int main()
{
	Mat img = imread("D:\\photogallery\\其他\\颜色卡.jpg");
	Mat imgGray, imgBlur,imgCanny,imgDil;
	//图片预处理
	resize(img, img, Size(), 0.8, 0.8);
	cvtColor(img, imgGray, COLOR_BGR2GRAY);
	GaussianBlur(imgGray, imgBlur, Size(3, 3), 0, 0);
	Canny(imgBlur, imgCanny, 25, 75);
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
	dilate(imgCanny, imgDil, kernel);

	getContours(imgDil,img);

	imshow("img", img);
	imshow("imggray", imgGray);
	imshow("imgblur", imgBlur);
	imshow("imgcanny", imgCanny);
	imshow("imgdil", imgDil);

	waitKey(0);
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,而OpenCV是一个开源的计算机视觉库。图像形状匹配是指在两幅图像中找出相似的物体或形状。 要在Qt中使用OpenCV进行图像形状匹配,我们可以首先加载和处理图像。可以使用OpenCV的函数读取图像文件,并将其转换为OpenCV的Mat格式。然后,可以对图像进行预处理,如调整大小、灰度化或二值化等。 接下来,我们可以使用OpenCV的模板匹配算法来实现图像形状匹配。模板匹配算法通过在图像中滑动一个模板图像,并计算模板图像与滑动窗口重叠区域的相似度来找到最佳匹配位置。OpenCV提供了多种模板匹配算法,如平方差匹配、相关匹配和归一化互相关匹配等。 在Qt中,我们可以在界面上显示原始图像和匹配结果。可以使用Qt的图像显示类,如QImage或QPixmap,将OpenCV的Mat格式图像转换为可在Qt界面上显示的格式。使用Qt的控件,如QLabel或QGraphicsView,将图像显示在界面上的特定位置。 最后,我们可以通过在Qt中实现用户交互来改进图像形状匹配的结果。例如,我们可以让用户在界面上绘制一个感兴趣的区域,并使用该区域作为模板进行匹配。还可以在匹配结果上绘制矩形或轮廓来突出显示匹配的物体或形状。 综上所述,Qt和OpenCV可以很好地结合起来实现图像形状匹配。Qt提供了界面设计和用户交互的功能,而OpenCV提供了处理图像和模板匹配的功能。通过合理地使用这两个库,我们可以轻松实现图像形状匹配的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值