opencv矩形识别

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;
using namespace std;

double angle(Point pt1, Point pt2, Point pt0)
{
	double dx1 = pt1.x - pt0.x;
	double dy1 = pt1.y - pt0.y;
	double dx2 = pt2.x - pt0.x;
	double dy2 = pt2.y - pt0.y;
	return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}//勾股定理验证是否满足直角的关系

void findRectInfo(std::vector<cv::Point> rect, int *rectInfo)
{
	int x[4] = { 0 }, y[4] = { 0 };
	int maxX = 0, maxY = 0, minX = 2000, minY = 2000;
	//get the rect points
	for (int i = 0; i<4; i++)
	{
		x[i] = rect[i].x;
		y[i] = rect[i].y;

		if (maxX<x[i])
			maxX = x[i];
		if (maxY<y[i])
			maxY = y[i];
		if (minX>x[i])
			minX = x[i];
		if (minY>y[i])
			minY = y[i];
	}
	rectInfo[0] = minY;
	rectInfo[1] = minX;
	rectInfo[2] = maxY - minY;
	rectInfo[3] = maxX - minX;
	//cout << "minY=" << minY << endl;
	//cout << "minX=" << minX << endl;
	//cout << "maxY - minY=" << maxY - minY << endl;
	//cout << "maxX - minX=" << maxX - minX << endl;
	return;
}

int main()
{
	Mat src = imread("755.jpg");

	Mat binaryzation, gray, pengzhang, deaden, edge;

	Mat dst = Mat::zeros(src.size(), CV_8UC3);

	cvtColor(src, gray, CV_BGR2GRAY);

	imshow("灰度", gray);
	
	//erzhi.create(src.size(), src.type());

	threshold(gray, binaryzation, 50, 255, THRESH_BINARY);

	imshow("二值化", binaryzation);

	Mat element = getStructuringElement(0, Size(2 + 1, 2 + 1), Point(1, 1));		// 构建内核

	dilate(binaryzation, pengzhang, element, Point(-1, -1), 2);			// 膨胀2次

	imshow("膨胀", pengzhang);

	blur(pengzhang, deaden, Size(3, 3));

	imshow("降噪", deaden);

	Canny(deaden, edge, 3, 9, 3);

	imshow("轮廓", edge);

	std::vector<std::vector<Point>> contours;
	std::vector<Vec4i> hierarchy;
	findContours(edge, contours, hierarchy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));
	
	RNG rng(0);

	std::vector<Point> approx;
	std::vector<std::vector<Point>> squares;

	for (int i = 0; i < contours.size(); i++)
	{
		//if (contours[i].size() < 10 || contours[i].size() > 100)
		//{
		//	continue;
		//}

		approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);


		if (approx.size() >= 4 && 
			fabs(contourArea(Mat(approx))) > 1000 &&
			isContourConvex(Mat(approx)))
		{

			printf("i = %d   %d \n", i, approx.size());

		//	double maxCosine = 0;		// 多边形逼近
		//	for (int j = 2; j < 5; j++)
		//	{
		//		double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
		//		maxCosine = MAX(maxCosine, cosine);
		//	}
		//	if (maxCosine < 0.1)
		//		squares.push_back(approx);

			int tmp[4] = { 0 };
			findRectInfo(approx, tmp);

			if (tmp[2] < 15				// 过滤出自己需要的轮廓
				|| tmp[2] > 35
				|| tmp[3] < 50
				|| *tmp < 500)
			{
				continue;
			}

			printf("%d  %d  %d  %d\n", *tmp, *(tmp + 1), *(tmp + 2), *(tmp + 3));

			Scalar color = Scalar(255, 255, 255);
			drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0));

		}
	}

	imshow("结果", dst);

	imwrite("ab.jpg", dst);

	waitKey();

	return 0;
}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Python-OpenCV可以用来识别矩形。可以通过使用cv2.findContours()函数来找到图像中的轮廓,然后使用cv2.approxPolyDP()函数来近似这些轮廓,最后使用cv2.drawContours()函数来绘制矩形。此外,还可以使用cv2.boundingRect()函数来获取矩形的位置和大小。 ### 回答2: Python-OpenCV 是一个非常流行的图像处理库,它可以用于各种各样的计算机视觉任务。其中一个常见的应用程序是矩形识别。简单来说,矩形识别是指在一张图像中识别出所有矩形的坐标,并对其进行必要的处理。 在 Python-OpenCV 中,矩形识别可以通过多种方式实现。其中一个常用的方法是使用轮廓检测。轮廓是一些连续的点组成的线条,它们沿着图像的边缘运行,并被用来识别物体的形状和大小。在 Python-OpenCV 中,可以使用 findContours() 函数来查找轮廓。 一旦找到了轮廓,我们就可以使用 approximation() 函数来近似为矩形。该函数选择最适合轮廓形状的最小矩形,该矩形可以是边界框或旋转矩形。通过使用这些技术,可以很容易地通过 Python-OpenCV 实现矩形识别。 实现矩形识别具有多种应用。例如,可以在计算机视觉系统中使用它来检测物体或区域。此外,可以在图像处理应用程序中使用矩形识别来自动裁剪图像或识别文档中的特定区域。总的来说,Python-OpenCV矩形识别是计算机视觉应用中非常振奋人心和有用的技术。 ### 回答3: 矩形识别是Python-OpenCV中常见的任务之一。在Python-OpenCV中,可以使用cv2.rectangle()函数进行矩形绘制。接下来是一些步骤,用于进行矩形识别: 1. 首先,从OpenCV库中导入cv2模块,并使用cv2.imread()函数读取一张图片。 2. 将图片转换为灰度图像。这可以使用cv2.cvtColor()函数完成。 3. 使用cv2.GaussianBlur()函数对原始图像进行模糊处理。这可以减少一些图像噪声。 4. 然后,可以使用cv2.Canny()函数检测边缘。这将产生一张二值化图像,其中端点会在物体的边缘上产生大量点。 5. 接下来,可以通过cv2.findContours()函数找到图像中所有的轮廓。 6. 对于每个找到的轮廓,可以使用cv2.approxPolyDP()函数来近似它们的形状。近似的多边形可以帮助找到矩形。 7. 对于近似的多边形,可以使用cv2.boundingRect()函数查找矩形的位置和大小。然后可以在图像上使用cv2.rectangle()函数绘制出矩形。 总之,使用Python-OpenCV进行矩形识别是一个四步骤的过程:灰度化、边缘检测、轮廓分析,矩形绘制。这些步骤都可以通过Python-OpenCV库中提供的函数轻松完成。但是对于复杂的场景,矩形识别还有许多待研究的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值