利用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);

利用OpenCV识别不规则图形轮廓并找其中心点和角度_第1张图片利用OpenCV识别不规则图形轮廓并找其中心点和角度_第2张图片

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

你可能感兴趣的:(OpenCv)