基于opencv的静态背景下的运动目标计数,急求源代码,谢谢!

基于opencv的静态背景下的运动目标计数,急求源代码,谢谢!,第1张

这只是一个静态背景的运动物体检测程序:

至于计数,我建议你使用先提取contour 然后计算coutour的number。

// 2012-5-8 21:05:30

// Moving object recognision

// By David Ding

#include "stdafx.h"

#include <opencv2/运掘opencv.hpp>

using namespace std

using namespace cv

#include <iostream>

#include <string.h>

#include <vector>

#include <ctime>

#include <windows.h>

using namespace cv

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("video", 1)

cvNamedWindow("background",1)

cvNamedWindow("foreground",1)

//使窗让冲口有序排列

cvMoveWindow("video", 30, 0)

cvMoveWindow("background", 360, 0)

cvMoveWindow("foreground", 690, 0)

if( argc >2 )

{

fprintf(stderr, "Usage: bkgrd [video_file_name]\n")

return -1

}

//打开摄像头

if (argc ==1)

if( !(pCapture = cvCaptureFromCAM(-1)))

{

fprintf(stderr, "Can not open camera.\n")

return -2

}

//打开视频文件

if(argc == 2)

if( !(pCapture = cvCaptureFromFile(argv[1])))

{

fprintf(stderr, "Can not open video file %s\n", 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)

//更新背景

cvRunningAvg(pFrameMat, pBkMat, 0.003, 0)

//将背景转化为图像格式,用以显示

cvConvert(pBkMat, pBkImg)

//显示图像

cvShowImage("video", pFrame)

cvShowImage("background", pBkImg)

cvShowImage("foreground", pFrImg)

//如果有按键事件,则跳出循环

//此等待也为cvShowImage函数提供时间完成显示

//等待时间可以根据CPU速度调整

if( cvWaitKey(2) >= 0 )

break

}

}

//销毁窗口

cvDestroyWindow("video")

cvDestroyWindow("background")

cvDestroyWindow("foreground")

//释放图像和矩阵

cvReleaseImage(&pFrImg)

cvReleaseImage(&pBkImg)

cvReleaseMat(&pFrameMat)

cvReleaseMat(&pFrMat)

cvReleaseMat(&pBkMat)

cvReleaseCapture(&pCapture)

return 0

}

使用OpenCV测量图像中物体的大小

图像目标尺寸检测类似于计算从我们的相机到一个物体的距离——在这两种情况下,我们都需要事先定义一个比率来测量每个给定度量单位的像素数(pixels_per_metric)。在这里所说的这个被称为“pixels_per_metric”的比率指标,我在接下来的部分中对其更正式的定义。

pixels_per_metric

为了确定图像中物体的大小,我们首先需要使用一个参照伏蠢物作为“校准”点。我们的参照物应该有两个重要的属性:

我们应该知道这个物体的真实尺寸(在宽度或高度上的毫米或英寸等值的大小)。

我们应该能够轻松地在图片中找到这个参照物,要么基于参照物的位置(如,参照物可以是一副图像中左上角的物体)或基于参照物的外表(例如参照物可以是图片中具有最独特的颜色或独一无二的形状,不同于所有其他的物体)。

在任何一种情况下,我们的参考应该以某种方式唯一可识别。

在这个例子中,我们将使用美分硬币作为我们的参照物,并且在所有示例中,确保它始终是我们图像中最左边的对象。

图1:我们将使用美分硬币作为参照贺厅清物,并确保它始终处于图像最左侧位置,这使得我们可以通过对它们位置的轮廓大小进行排序,进一步来提取信息。

通过保证美分硬币是最左边的物体,我们可以从左到右对我们的物体等高线区域进行排列,抓住这个硬币(它将始终对应于排序列表中的第一个等高线区域)。并使用它来定义我们的pixels_per_metric比率,我们将其定义为:

pixels_per_metric =物体像素宽 / 物体真实宽

美分硬币的真实宽度是0.955英寸。现在,假设我们图像中硬币的像素禅前宽为150像素(基于它的相关边界框)。那么这种情况下pixels_per_m

这和python真的关系不大啊。15年前有一个研究生的论文是同样的内容。他用的是C++实现的。现在就简单子漏如。直接调用opencv就可以抓图像,运动检测也有现成的算法。opencv就可以使用python调用。同样图像处理算法大多也都可以使用python调用。包括PIL。简单的算法可以使用码书算法检测变化矢量。

毕业设计用的程序没有前薯几千慧搜者行不够份量啊。你在知道里问,感觉夸张了些啊。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12457397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存