#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<vector>
#include<math.h>
#include<iostream>
#include<string>
using namespace cv;
using namespace std;
/***** 求两点间距离*****/
float getDistance(CvPoint pointO, CvPoint pointA)
{
float distance;
distance = powf((pointO.x - pointA.x), 2) + powf((pointO.y - pointA.y), 2);
distance = sqrtf(distance);
return distance;
}
int main()
{
namedWindow("test", WINDOW_AUTOSIZE);
namedWindow("hh", 2);
VideoCapture cap("G:\\视觉题\\大能量机关(红+关灯).mov");
/*cap.open("G:\\视觉题\\大能量机关(红+关灯).mov");*/
while (1)
{
/*Mat frame;
Mat midImage, seed;
cap >> frame;
if (frame.empty()) break;
vector<Mat> imgChannels;
split(frame, imgChannels);
midImage = imgChannels.at(2) - imgChannels.at(0);
threshold(midImage, midImage, 100, 255, CV_THRESH_BINARY);
floodFill(midImage, Point(5, 50), Scalar(0),0, FLOODFILL_FIXED_RANGE);
Mat dstImage = Mat::zeros(midImage.rows, midImage.cols, CV_8UC3);*/
Mat frame;
Mat midImage,hsv;
Point2f p;
cap >> frame;
if (frame.empty()) break;
cvtColor(frame, hsv, CV_BGR2HSV);
inRange(hsv, Scalar(11, 43, 46), Scalar(25, 255, 255), midImage);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
morphologyEx(midImage, midImage, MORPH_CLOSE, element);
imshow("hh", midImage);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(midImage, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
for (int j = 0; j < contours.size(); j++)
{
double t = contourArea(contours[j]);
if (t > 700 && t < 1000)
{
RotatedRect box;
box = minAreaRect(contours[j]);
p = box.center;
/*调试*/
Point2f vertex1[4];
box.points(vertex1);
for (int i = 0; i < 4; i++)
line(frame, vertex1[i], vertex1[(i + 1) % 4], Scalar(0, 0, 225), 2, LINE_AA);
cout << t << endl;
}
}
for (int j = 0; j < contours.size(); j++)
{
double t = contourArea(contours[j]);
if (t > 11000 && t < 12100)
{
vector<Point> result;
for(int i=0;i< contours[j].size();i++)
if(getDistance(contours[j][i],p)>230)
{
result.push_back(contours[j][i]);
}
RotatedRect boxtemp2;
boxtemp2 = minAreaRect(result);
Point2f vertex1[4];
Point2f p0 = boxtemp2.center;
boxtemp2.points(vertex1);
for (int i = 0; i < 4; i++)
line(frame, vertex1[i], vertex1[(i + 1) % 4], Scalar(225, 0, 0), 2, LINE_AA);
circle(frame,p0,6,Scalar(0, 225, 0), -1);
}
}
imshow("test", frame);
waitKey(1);
}
return 0;
}