怎么检测一个快速运动的物体?
这个如果是检测物体速度的话,可以用ZDS05或者LDM301激光测距测速传感器的,至于可以检测的速度范围可以咨询真尚有,可以用于汽车速度检测。
怎么用OpenCV进行运动物体数量的检测啊
opencv就是一个库,你需要干什么调用里面的函数就可以啦,你的这个是用简单的背景差法做的检测吧,在你程序前面加句读取视频的代码就好啦
求助一下关于运动物体检测与跟踪的问题,谢谢
图像序列中运动物体的检测与跟踪是计算机视觉领域的重要研究课题之一,其中在视频图像序列中对特定目标进行检测和跟踪成为一些重要部门进行安全监控中的关键一环。
我们作了大量研究,设计了一种运动物体检测和跟踪算法。该算法主要包含了三大部分:视频图像序列预处理、运动物体检测和运动物体跟踪。本算法首先采用自适应中值滤波对图像序列进行预处理,然后采用改进的混合高斯模型进行物体检测定位,并根据遮挡和未遮挡情况分别采用不同的方法对运动目标的质心进行实时跟踪。谁知道如何用matlab做动态背景下运动物体的检测
可靠,所以现在主要以手势/人脸识别为主;这是因为手和脸上面有比较独特的特征点。你说的滤波归根结底还是要找出具有灰度跳变的高频部分作为人体;这除非背景中除了人以外没有其他突出的物体;否则光凭滤波二值法检测人体是不太现实。
2 两张图片中人要是产生相对运动,检测起来就容易多了;利用帧间差分找到图像中灰度相差大的部分(你用的滤波也是一种手段);然后二值化区域连通;要是图像中没有其他移动物体计算连通区域的变动方向就是人的运动方向。你可以去PUDN上搜搜相关的目标检测的代码;完全和你这个对应是不可能的。照你说的情况可以先建立起静态背景的模型(或者直接在没人的时候拍张);然后不断的与这个背景做差,原理和帧间差分一样。建议你先从典型的帧间差分例程开始下手(比如移动车辆的检测,这个比较多)。 你在二值化之后加上一个区域连通的步骤;即使用膨胀或者闭运算;这样你的轮廓就是连续的了;用matlab的话bwlabel可以统计连通区域里面像素的个数也就是人体面积大小。质心就是横竖坐标的平均值;取所有人体点的横竖坐标分别累加;除以坐标总数得到的x和y平均值;这个就是质心了如何检测一个快速运动物体的有无
用高频的激光位移传感器测试就可以了,测到了就有模拟量输出,没测到就没有任何模拟量。
opencv实现的AVI视频中运动物体识别与追踪的程序
以前有OPENCV的官网,可以下载到源代码的,我这边贴一个基于vc2005的源代码吧。
#include <stdio.h>#include<iostream>#include <cv.h>#include <cxcore.h>#include <highgui.h>using namespace std; int main( int argc, char** argv ){ //声明IplImage指针 IplImage* pFrame = NULL; IplImage* pFrImg = NULL; IplImage* pBkImg = NULL; CvMat* pFrameMat = NULL; CvMat* pFrMat = NULL; CvMat* pBkMat = NULL; CvCapture* pCapture = NULL; int nFrmNum = 0; //创建窗口 cvNamedWindow("background",1); cvNamedWindow("video", 1); cvNamedWindow("foreground",1); //排列窗口 cvMoveWindow("background", 30, 500); cvMoveWindow("video", 350, 0); cvMoveWindow("foreground", 690, 500);//打开视频文件 if(argc == 2) if( !(pCapture = cvCaptureFromFile(argv[1]))) { fprintf(stderr, "文件打开错误", argv[1]); return -2; } //逐帧读取视频 while(pFrame = cvQueryFrame( pCapture )) { nFrmNum++; //如果是第一帧,则申请内存,并初始化 if(nFrmNum == 1) { pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,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, 60, 255.0, CV_THRESH_BINARY);//形态学滤波(去噪音) cvErode(pFrImg, pFrImg, 0, 1); cvDilate(pFrImg, pFrImg, 0, 1);//把图像转正 pBkImg->origin=1; pFrImg->origin=1;//对pFrImg上的已经识别出的运动物体,在pFrame上画跟踪框 int x,y; for (y=pFrImg->height - 1;y>=250;y--) { uchar* ptr = (uchar*)(pFrImg->imageData+pFrImg->widthStep*y); //将imageData指针指向第y行头部 for (x=0;x<pFrImg->width;x++) { if(ptr[x]!=0)//判断地y行第x个元素是否有图像,如果有图像,则画跟踪框 { CvPoint pt1_Rect; CvPoint pt2_Rect; pt1_Rect.x=x-30; pt1_Rect.y=y; pt2_Rect.x=x+30; pt2_Rect.y=y-300; int thickness=3; int line_type=8; CvScalar color=CV_RGB(255,0,0); cvRectangle( pFrame, pt1_Rect, pt2_Rect,color ,thickness, line_type, 0 ); y=-1; break; } }} //显示图像 cvShowImage("video", pFrame); cvShowImage("background", pBkImg); cvShowImage("foreground", pFrImg); //如果有按键事件,则跳出循环 //为cvShowImage函数提供时间完成显示 //等待时间可以根据CPU速度调整 if( cvWaitKey(27) >= 0 ) break;} }//销毁窗口 cvDestroyWindow("video"); cvDestroyWindow("background"); cvDestroyWindow("foreground"); //释放图像和矩阵 cvReleaseImage(&pFrImg); cvReleaseImage(&pBkImg); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat); cvReleaseMat(&pBkMat); cvReleaseCapture(&pCapture); return 0;}