打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
opencv图像处理5
void CTrafficsampleDlg::OnOK() //读入视频并检测车辆
{

// TODO: Add extra validation here

//此处添加图像处理的代码


//CDialog::OnOK();
IplImage *frame = NULL; //定义帧,每帧就是一张图
IplImage *B_part = NULL, *G_part = NULL, *R_part = NULL;
IplImage *pFrImg = NULL; //前景图片
IplImage *pBkImg = NULL; //背景图片
IplImage *dst = NULL;


CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contour = 0;

//轮廓矩形
CvRect contourRect = cvRect(0,0,0,0);


//可以获取视频的各种属性
CvCapture * pCapture = cvCreateFileCapture("traffic.avi");


cvNamedWindow("Camera",CV_WINDOW_AUTOSIZE); //设置窗口
cvNamedWindow("temp", CV_WINDOW_AUTOSIZE);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
cvNamedWindow("contours",1);

cvMoveWindow("background", 360, 0);
cvMoveWindow("foreground", 690, 0);


//初始化高斯混合模型参数
CvGaussBGModel *bg_model=NULL;



int count = 1;
while (frame = cvQueryFrame(pCapture))
{
if(count ==1)
{
B_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
G_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
R_part = cvCreateImage(cvGetSize(frame),frame->depth,1);
pBkImg = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U,3);
pFrImg = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U,1);
dst = cvCreateImage( cvGetSize(frame), 8, 3 );//找到轮廓并绘制轮廓
bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(frame, 0);
}
else
{
cvUpdateBGStatModel(frame, (CvBGStatModel *)bg_model );//更新高斯背景模型

//pFrImg为前景图像,只能为单通道
//pBkImg为背景图像,可以为单通道或与pFrame通道数相同
cvCopy(bg_model->foreground,pFrImg,0);
cvCopy(bg_model->background,pBkImg,0);
//把图像正过来
pBkImg->origin=1;
pFrImg->origin=1;
cvSplit(frame , B_part,G_part, R_part,0);
cvFlip(B_part,B_part,0);//沿X轴翻转一次


//下面进行阈值分割
//如何确定阈值??是否存在编好的函数呢?
//固定阈值分割方式,会导致一张图片中如果亮暗不均,一张图的不同区域分割效果差距很大
//如果能够提前提取出图像的背景,然后想减的方式会使分割效果变好
cvThreshold(B_part,B_part, 195, 255,CV_THRESH_BINARY);


//阈值分割之后,进行膨胀操作和腐蚀操作
//默认的模板由于腐蚀和膨胀的幅度比较大,效果不是很好啊
//最好是自定义模板
//观察白线大多为竖直的,腐蚀时主要是横向腐蚀
//车体车头和车身由于在前玻璃的分割作用,数要是在竖向,膨胀时主要在竖向,但是需避免造成两车的太近而融为一体
IplConvKernel * kenel = cvCreateStructuringElementEx(3,1,1,0,CV_SHAPE_RECT,NULL);
IplConvKernel * kenel2 = cvCreateStructuringElementEx(1,3,0,1,CV_SHAPE_RECT,NULL);

cvErode(B_part, B_part,kenel,1 );
cvDilate(B_part,B_part,kenel,1);
cvErode(B_part, B_part,kenel2, 1);
vErode(B_part, B_part,kenel,1 );

cvDilate(B_part,B_part,kenel2,2);
cvDilate(B_part,B_part,kenel2,2);
cvDilate(B_part,B_part,NULL,1);


//获取并绘制轮廓
cvFindContours( B_part, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
cvZero( dst );
for( ; contour != 0; contour = contour->h_next )
{


contourRect = cvBoundingRect(contour,0);


if((contourRect.width > 10) &&(contourRect.height >12)){
CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );//每次都随机颜色显示
/* 用1替代 CV_FILLED 所指示的轮廓外形 */
cvDrawContours( dst, contour, color, color, -1, CV_FILLED, 8 );
//cvRectangle(pFrame,pt3,pt4,CV_RGB(255,0,0),1, 8, 0 );
cvRectangle(dst ,cvPoint(contourRect.x, contourRect.y),
cvPoint(contourRect.x + contourRect.width, contourRect.y + contourRect.height),
CV_RGB(255,0,0),
1,
8,
0);
}

}


cvShowImage("Camera", frame);
cvShowImage("temp" ,B_part);
cvShowImage("background", pBkImg);
cvShowImage("foreground", pFrImg);
cvShowImage( "contours", dst );


int key1;
key1 = cvWaitKey (300);
if (key1 == 'q' || key1 == 'Q')
break;


}
count++;
}



cvDestroyWindow("temp");
cvReleaseCapture(&pCapture); //销毁摄像头
cvDestroyWindow("Camera"); //销毁窗口
cvReleaseBGStatModel((CvBGStatModel**)&bg_model);
cvDestroyWindow("background");
cvDestroyWindow("foreground");
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseImage(&dst);
cvDestroyWindow("contours");
//CTrafficsampleDlg::OnOK();
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
视频运动目标跟踪,基于opencv,vc++
OpenCV编程案例:混合高斯模型(CvGaussBGModel)使用案例 - OpenC...
linux下的OpenCV安装&学习笔记(修订版,解决无法打开视频文件问题)
CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型
OpenCV背景去除的几种方法
50行Python代码实现物体颜色识别和跟踪(必须以红色为例)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服