利用OpenCV识别不规则图形轮廓并找其中心点和角度

关于寻找图形的轮廓,想来大家都不陌生。但平常寻找并进行识别的轮廓都是较为标准的图形,如圆形,矩形等。但在一些特殊情况下,我们所检测的图形并不是理想的标准图形。比如说我们检测元件的引脚,由于各种环境因素及打光条件。拍摄出来的图像并不尽人意。这时我们需要判断引脚的坐标(轮廓的中心)及其角度偏差是否满足合格的标准。
对于这种情况,我想到的方法是对不规则轮廓外接最小旋转矩形。其矩形的中心坐标和角度就是我们所需要的数据。
具体代码如下:

//读入图像,转换为灰度
	Mat img = imread("Dtest2.bmp");
	vector<cv::Point> Dpoint;
	double angle;
	Mat bw;
	bool dRet;
	cvtColor(img, bw, COLOR_BGR2GRAY);
	//阈值处理
	threshold(bw, bw, 150, 255, CV_THRESH_BINARY);
	//寻找轮廓
	vector<vector<Point> > contours;
	vector<Vec4i> hierarchy;
	vector<double>angles;
	findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
	//轮廓分析,找到
		//去除过小或者过大的轮廓区域(科学计数法表示)
	for (size_t i = 0; i < contours.size(); ++i)
	{
		//计算轮廓大小
		double area = contourArea(contours[i]);
		if (area < 1e2 || 1e5 < area) continue;
		//绘制轮廓
	drawContours(img, contours, i, CV_RGB(255, 0, 0), 2, 8, hierarchy, 0);
		//获得轮廓的角度
		Point2f* pos = new Point2f();
		double dOrient = getOrientation(contours[i], *pos, img);
		if (dOrient < 0)
		{
			 angle = -dOrient * 90;
		}
		else
		{
			angle = 90 - (dOrient * 90);
		}
		转换轮廓,并获得极值
		for (size_t j = 0; j < contours[i].size(); j++)
			contours[i][j] = GetPointAfterRotate(contours[i][j], (Point)*pos, dOrient);
		Rect rect = boundingRect(contours[i]);//轮廓最小外接矩形
		RotatedRect rotateRect = RotatedRect((Point2f)rect.tl(), Point2f(rect.br().x, rect.tl().y), (Point2f)rect.br());
		//将角度转换回去并绘图 
		Point2f rect_points[4];
		rotateRect.points(rect_points);
		for (size_t j = 0; j < 4; j++)
			rect_points[j] = GetPointAfterRotate((Point)rect_points[j], (Point)*pos, -dOrient);
		for (size_t j = 0; j < 4; j++)
			line(img, rect_points[j], rect_points[(j + 1) % 4], Scalar(255, 255, 0), 2);
		circle(img, rotateRect.center, 2, Scalar(0, 255, 0), 2, 8, 0);
		//得出结果    
		char cbuf[255];
		double fshort = std::min(rect.width, rect.height);
		double flong = std::max(rect.width, rect.height);
		cout << "r.x = " << rotateRect.center.x << "  r.y  = " << rotateRect.center.y << " angle = " << angle << endl;
		imshow("dst", img);

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

据此,我们可以根据实际情况设定距离扰动和角度扰动的大小进行判断。如有不足,还请指正。转载请标明出处。希望能对各位有所帮助。

  • 12
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
识别物体的偏转角度和面积,可以使用OpenCV中的一些函数和算法。下面是一些可能有用的函数: 1. cv2.findContours() - 用于查图像中的轮廓。 2. cv2.minAreaRect() - 用于计算轮廓的最小外接矩形,该矩形可以提供物体的角度。 3. cv2.contourArea() - 用于计算轮廓的面积。 下面是一个简单的示例代码,演示如何使用这些函数来计算物体的偏转角度和面积: ``` import cv2 import numpy as np # 读取图像 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 ret, thresh = cv2.threshold(gray, 127, 255, 0) # 查轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 遍历所有轮廓 for cnt in contours: # 计算轮廓的面积 area = cv2.contourArea(cnt) # 如果面积小于某个值,则忽略该轮廓 if area < 100: continue # 计算轮廓的最小外接矩形 rect = cv2.minAreaRect(cnt) # 提取矩形顶点坐标和角度 box = cv2.boxPoints(rect) box = np.int0(box) angle = rect[2] # 在图像上绘制矩形和角度 cv2.drawContours(img, [box], 0, (0, 0, 255), 2) cv2.putText(img, '{:.1f}'.format(angle), (box[0][0], box[0][1]), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了一张测试图像,然后将其转换为灰度图像并进行二值化处理。然后使用`cv2.findContours()`函数查轮廓。接下来,我们遍历所有轮廓,并计算它们的面积。如果面积小于某个值,则忽略该轮廓。否则,我们使用`cv2.minAreaRect()`函数计算轮廓的最小外接矩形,并提取矩形的顶点坐标和角度。最后,我们在图像上绘制矩形和角度,并显示结果。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值