OpenCV3 摄像头BDB识别

#include "biao.h"

biao::biao()
{
}

biao::~biao()
{
}



void biao::Dectector(Mat frame)
{
	//frame.copyTo(begin);
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	dilate(frame, canny_image, element);
	//imshow("膨胀", canny_image);

	Mat gray_image;
	cvtColor(canny_image, gray_image, CV_RGB2GRAY);

	//滤波处理
	//GaussianBlur(gray_image, blur_image, Size(3, 3), 0, 0);

	Mat canny_image, canny_image2;
	Canny(gray_image, canny_image, 100, 150, 3);

	

	//查找轮廓
	Mat contour_image;
	contour_image = canny_image.clone();
	vector<vector<Point>>contours;
	findContours(contour_image, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	contour_image = cv::Scalar::all(0);	//黑背景画白线

	vector <vector <Point>> ::const_iterator it = contours.begin();
	while (it != contours.end())
	{
		if (it->size() < 20)	
			it = contours.erase(it);
		else
			++it;
	}


	drawContours(contour_image, contours, -1, Scalar(255), 1);
	
	imshow("fincounters", contour_image);


	for (int i = 0; i < contours.size(); ++i)	//圈出
	{
		////Rect rect = boundingRect(contours[i]);
		//RotatedRect rect = minAreaRect(contours[i]);
		////circle(srcImg, Point(rect + rect.width / 2, rect.y + rect.height / 2), 50, Scalar(0, 0, 255), 3);
		//circle(srcImg, rect.center, 50, Scalar(0, 0, 255), 3);
		//(srcImg, rect, Scalar(0, 0, 255), 2);
		
		//=============【1】寻找最小包围矩形================
		minRect = minAreaRect(contours[i]);
		rotate.push_back(minRect);

	}
	number_Key = 0;
	for (int i = 0; i < contours.size(); ++i)	//N个矩形
	{
		Point2f vertices[4];
		rotate[i].points(vertices);  
		if ((rotate[i].size.width / rotate[i].size.height) >= 0.85 && (rotate[i].size.width / rotate[i].size.height) <= 1.15 && (rotate[i].size.width * rotate[i].size.height) >= 1600)
		{
			number_Key++;
			Key_rotate.push_back(rotate[i]);
			for (int j = 0; j < 4; j++)		//某一矩形四条线
			{
				line(frame, vertices[j], vertices[(j + 1) % 4], Scalar(0, 0, 255), 2, 8);

			}
			
		}
	}

	if (number_Key >= 2)	//有对象
	{
		crossp.x = (Key_rotate[1].center.x + Key_rotate[0].center.x) / 2;
		crossp.y = (Key_rotate[1].center.y + Key_rotate[0].center.y) / 2;


		//line(frame, Point(100,100), Point(120,100), Scalar(0, 0, 255), 2, 8);

	

		fill_rect1 = RotatedRect(crossp, Size(Key_rotate[0].size.width * 2, Key_rotate[0].size.height * 2), Key_rotate[0].angle);
		Point2f vertices2[4];
		fill_rect1.points(vertices2);


		for (int j = 0; j < 4; j++)		//某一矩形四条线
		{
			line(frame, vertices2[j], vertices2[(j + 1) % 4], Scalar(0, 255, 0), 3, 8);
		}

		circle(frame, crossp, 8, Scalar(0, 255, 0), -1);

	}

	imshow("frame", frame);

	waitKey(1);

	crossPoint.clear();
	rotate.clear();
	Key_rotate.clear();
	}
//摄像头

void biao::start()
{
	VideoCapture capture(0);

	while (1)
	{
		Mat srcImg;
		capture >> srcImg;
		if (!srcImg.empty())
		{
			Dectector(srcImg);
		}

		else cout << "无图" << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44643038/article/details/89277810