您的位置:首页 > 运维架构

车辆检测与标记(基于opencv2)

2015-10-31 21:04 441 查看
#include <iostream>

#include<opencv2/opencv.hpp>

using namespace std;

using namespace cv;

//函数声明

void Procss(Mat srcImage);

void line(Mat srcImage1);//视频中画矩形

//全局变量声明

string name[12]={"1","2","3","4","5","6","7","8","9","10","11","12"};//图片要写的字符

//

Mat frame;//视频帧

Mat background;//背景

int main()

{

Mat tmpImage;//临时帧

char FilePathName[200]="E:\\图片\\AVSEQ01.avi";
//视频路径

VideoCapture capture(FilePathName);//读取本地视频

if(!capture.isOpened())

{

cout<<"加载视频失败,请检查文件路径设置!"<<endl;

return -1;

}

namedWindow("原视频");

namedWindow("处理后");

bool stop(false);

while(!stop)

{

if (!capture.read(frame))

break;

frame.copyTo(tmpImage);//把视频复制到临时帧进行处理

line(frame);
//画矩形

Procss(tmpImage);

imshow("原视频",frame);

if (waitKey(10)>=0)

stop= true;

}

waitKey();

return 0;

}

void line(Mat srcImage1)

{

rectangle(srcImage1,Point(250,100),Point(450,280),Scalar(255,255,0),1,CV_AA);

}

void Procss(Mat srcImage)

{

cvtColor(srcImage,srcImage,CV_BGR2GRAY);//转化为灰度图

GaussianBlur(srcImage,srcImage,Size(3,3),0,0);//高斯滤波

threshold(srcImage,srcImage,60,255,CV_THRESH_BINARY_INV);//二值化

Mat element=getStructuringElement(MORPH_RECT,Size(13,13),Point (1,1));

dilate(srcImage,srcImage,element);//膨胀

//定义轮廓和层次结构

vector<vector<Point>> contours;

vector<Vec4i> hierarchy;

findContours(srcImage,contours,hierarchy,CV_RETR_EXTERNAL ,CV_CHAIN_APPROX_SIMPLE);

int avgX = 0;//运动物体的矩形的中点X位置

int avgY = 0;//运动物体的矩形的中点Y位置

cout<<"day "<<contours.size()<<endl;

int i=0;

for( size_t k = 0; k < contours.size(); k++ )

{

Rect ret1=boundingRect(Mat(contours[k]));//计算右上点集的边界矩形

avgX = (ret1.x + ret1.x + ret1.width) / 2;
//运动物体的矩形的中点X位置

avgY = (ret1.y + ret1.y + ret1.height) / 2;//运动物体的矩形的中点Y位置

Point pt1;

pt1.x = ret1.x;//写字的左下角点

pt1.y = avgY;

circle(frame,Point(avgX,avgY),1,Scalar(0,255,0),-1,8);

//

Point pt2,pt3;

pt2.x=ret1.x;
//pt2物体边界矩形左上角坐标

pt2.y=ret1.y;

pt3.x=ret1.x+ret1.width;
//pt3物体边界矩形右上角坐标

pt3.y=ret1.y+ret1.height;

if(avgX>250 && avgX<450 && avgY<280 && avgY>100)
//物体轮廓的中心在ROI区域才显示

{

if(ret1.height>35)
//把长度小于某个阀值的干扰矩形去掉

{

rectangle(frame,pt2,pt3,Scalar(255,0,0),1, 8, 0 );
//对检测到的物体画矩形

if(i<=12)

{

putText(frame,name[i], pt1,FONT_HERSHEY_SIMPLEX,1,Scalar(0,255,0));//在车辆的中心写编号

i++;

}

else

{

i=0;

}

}

}

}

moveWindow("处理后",660,100);

imshow("处理后",srcImage);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: