代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Rect roi;
void processFrame(Mat &mask,Rect &rect)
{
vector< vector<Point> > contours;
vector< Vec4i > hireachy;
findContours(mask,contours,hireachy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point(0,0));
if(contours.size() > 0)
{
double maxArea = 0.0;
for(size_t t=0; t<contours.size();t++){
double area = contourArea(contours[static_cast<int>(t)]);
if(area > maxArea)
{
maxArea = area;
rect = boundingRect(contours[static_cast<int>(t)]);
}
}
}
else{
rect.x = rect.y = rect.width = rect.height = 0;
}
}
int main(int argc, char** argv)
{
VideoCapture capture;
capture.open("./video/video_006.mp4");
//VideoCapture capture(0);
if(!capture.isOpened())
{
printf("[%s][%d]could not load video data...\n",__FUNCTION__,__LINE__);
return -1;
}
Mat frame,mask;
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
Mat kernel2 = getStructuringElement(MORPH_RECT,Size(5,5),Point(-1,-1));
while(capture.read(frame))
{
inRange(frame,Scalar(0,127,0),Scalar(120,255,120),mask);
morphologyEx(mask,mask,MORPH_OPEN,kernel,Point(-1, -1),1);
dilate(mask,mask,kernel2,Point(-1,-1),4);
processFrame(mask,roi);rectangle(frame,roi,Scalar(0,0,255),3,8,0);
imshow("input",frame);
if(waitKey(33) == 27)
{
break;
}
}
capture.release();
waitKey(0);
return 0;
}
效果: