opencv 矩形边框 boundingRect minAreaRect approxPolyDP

#include "iostream"
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main()
{
	Mat  img, temp, temp2,dst, dstbin, distancetransform,rel, rel2,gary, _threshold, temp3;

	img = imread("shou.jpg");

	resize(img, dst, Size(0, 0), 0.1, 0.1);
	dst.copyTo(temp3);

	cvtColor(dst, gary, COLOR_BGR2GRAY);

	threshold(gary, _threshold, 100, 255, THRESH_TOZERO);
	GaussianBlur(_threshold, temp2, Size(7, 7), 5, 0);
	Mat canny;
	Canny(temp2, canny, 80, 160, 3, false);

	Mat kernel = getStructuringElement(1, Size(3, 3));

	//erode(canny, canny, kernel);
	dilate(canny, canny, kernel);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(canny, contours, hierarchy, 0, 2, Point());

	for (int i = 0; i < contours.size(); i++)
	{
		Rect rect = boundingRect(contours[i]);
		RotatedRect rotatedrect = minAreaRect(contours[i]);
		Point2f _points[4];
		rotatedrect.points(_points);

		Point2f cen = rotatedrect.center;

		circle(dst, cen, 3, Scalar(255, 0, 0));

		//rectangle(dst, rect, Scalar(0, 255, 0));

		for (int j = 0; j < 4; j++)
		{
			if (j == 3)
			{
				line(dst, _points[j], _points[0], Scalar(0, 0, 255));
				break;
			}
			line(dst, _points[j], _points[j + 1], Scalar(0, 0, 255));
		}
		Mat po;
		approxPolyDP(contours[i], po, 4, true);
		for (int n = 0; n < po.rows; n++)
		{
			if (n == po.rows - 1)
			{
				Vec2i vec1 = po.at<Vec2i>(n);
				Vec2i vec2 = po.at<Vec2i>(0);
				line(temp3, vec1, vec2, Scalar(255, 0, 255));
				break;
			}
			Vec2i vec11 = po.at<Vec2i>(n);
			Vec2i vec22 = po.at<Vec2i>(n+1);
			line(temp3, vec11, vec22, Scalar(255, 0, 255));
		}
	}
	imshow("dst", dst);
	imshow("temp3", temp3);
	imshow("canny", canny);

	waitKey(0);

	return 1;
}

猜你喜欢

转载自blog.csdn.net/dwm88888888/article/details/131872210