#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;
}
}
OpenCV3 摄像头BDB识别
猜你喜欢
转载自blog.csdn.net/qq_44643038/article/details/89277810
今日推荐
周排行