车辆检测与标记(基于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);
}
#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);
}
相关文章推荐
- CentOS Linux解决Device eth0 does not seem to be present
- apache-hama-kcore
- Linux操作系统基础
- corosync+pacemaker+crmsh实现3节点高可用web服务
- Apache Mahout的KMeans算法测试
- LNMP - nginx代理详解
- LNMP - nginx禁止指定user_agent
- LNMP - nginx访问控制
- devstack部署openstack的情况下,重启openstack服务
- Linux
- workers.properties配置
- LNMP - nginx配置防盗链
- LNMP - nginx配置静态文件过期时间
- 浅谈MVP架构及开发模式
- TypeError: Cannot read property 'root' of null
- Linux 装完系统后,后添加网卡
- apache 与 tomcat 服务器的三种连接配置方式
- 0ops CTF/0CTF writeup
- Xenia and Bit Operations 【线段树】
- Linux系统用户与用户组