至于计数,我建议你使用先提取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。简单的算法可以使用码书算法检测变化矢量。毕业设计用的程序没有前薯几千慧搜者行不够份量啊。你在知道里问,感觉夸张了些啊。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)