opencv运动车里检测跟踪轨迹不对
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv运动车里检测跟踪轨迹不对相关的知识,希望对你有一定的参考价值。
正确轨迹应该是红色的,而实际得到的是绿色的那条轨迹
背景提取代码:
CvMat* pFrameMat = NULL; CvMat* pFrMat = NULL; CvMat* pBkMat = NULL; int nFrmNum = 0; //创建窗口 cvNamedWindow("BackImg",1); while(nFrmNum<=140) pFrame = cvQueryFrame( pCapture ); if(!pFrame) break; nFrmNum++; //如果是第一帧,需要申请内存,并初始化 if(nFrmNum == 1) pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),8,1); pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), 8,1); pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); //转化成单通道图像再处理 cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); cvConvert(pFrImg, pFrMat); cvConvert(pFrImg, pBkMat); else cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); //先做高斯滤波,以平滑图像 cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); //当前帧跟背景图相减 cvAbsDiff(pFrameMat, pBkMat, pFrMat); //二值化前景图 cvThreshold(pFrMat, pFrImg, 10, 255.0, CV_THRESH_BINARY); //更新背景 cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); //将背景转化为图像格式,用以显示 cvConvert(pBkMat, pBkImg);
pFrame->origin = IPL_ORIGIN_BL; pFrImg->origin = IPL_ORIGIN_BL; pBkImg->origin = IPL_ORIGIN_BL; cvFlip(pFrame,pFrame,0); cvShowImage("video", pFrame); cvFlip(pBkImg,pBkImg,0); cvShowImage("BackImg", pBkImg); cvShowImage("BackImg",pBkImg);
可是我跟踪的轨迹不正确啊,如果我用差分法得到的背景去跟踪轨迹就是正确的,我用混合高斯模型得到的背景去跟踪,轨迹就错了,这是为什么呢???
用OpenCV怎么才能把运动目标的轨迹用点画出来?
为什么只能画出跟踪的当前点,而没有之前的点,求大神帮忙修改一下啊
cv::Mat cImageBGR;
cv::Point2f mypoint;
vector<cv::Point2f> points;
points.push_back(mypoint);
for ( int j = 0; j < points.size(); ++ j )
cv::circle( cImageBGR, points[j], 3, cv::Scalar( 0, 0, 255 ), 4 );
2. 使用带点的画刷,来画线。本回答被提问者采纳
以上是关于opencv运动车里检测跟踪轨迹不对的主要内容,如果未能解决你的问题,请参考以下文章