此篇文章是学习csdn学院的个教程视频中的例子,于是跟着视频自己也学着实现了。先得准备一些基本的图像操作知识。
主要为图像的缩放、高斯模糊、颜色空间转化、二值化
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
void find_move_people();
int main(void)
{
char *f = "E:\\opencv\\opencv\\sources\\samples\\wp8\\OpenCVXaml\\OpenCVXaml\\Assets\\Lena.png";
Mat lena,lena2,gasLena,lenaColor,lenaBinary;
lena = imread(f);
//图片调整为原来的四分之一。4、5参数是在x和y上的缩放,默认为0,最后通常也是INTER_LINEAR
resize(lena, lena2, Size(lena.cols / 2, lena.rows / 2), 0.5, 15 , cv::INTER_LINEAR);
// 高斯模糊,第三个为平滑窗口的size , 4、5为在水平和竖直方向的平滑系数namuda值,最后一个也通常使用默认值
GaussianBlur(lena, gasLena, Size(9, 9), 6, 6, 0);
// 转换颜色空间,可以转化为yuv,下面是转化为灰度图
cvtColor(lena, lenaColor, CV_BGR2GRAY);
//二值化。3为阈值,4为大于阈值的像素灰度值,5为二值化类型
threshold(lenaColor, lenaBinary, 145, 225, THRESH_BINARY);
imshow("lena", lena);
imshow("lena2", lena2);
imshow("lena3", gasLena);
imshow("lena4", lenaColor);
imshow("lena5", lenaBinary);
waitKey(0);
}
执行的结果相信大家见过很多次,也就不列举出来了。
目标视频为opencv的sample内的视频,利用高斯混合模型来实现目标跟踪:
void find_move_people()
{
char *video_path = "E:\\opencv\\opencv\\sources\\samples\\data\\vtest.avi";
VideoCapture capture;
Mat frame, image, foreGround, backGround, fgMask;
// Ptr pBgmodel = createBackgroundSubtractorMOG2().dynamicCast();
Ptr pBgmodel = createBackgroundSubtractorMOG2();
pBgmodel->setVarThreshold(20);
capture.open(video_path);
if (!capture.isOpened())
{
cout << "open videp eror!" << endl;
}
while (true)
{
//frame是原始帧
capture >> frame;
if (frame.empty())
break;
//缩小为原来四分之一,加快处理速度
resize(frame, image, Size(frame.cols / 2, frame.rows / 2), INTER_LINEAR);
if (foreGround.empty())
foreGround.create(image.size() , image.type());
//得到前景图像,是黑白灰 3种灰度值的图
pBgmodel->apply(image, fgMask);
// 下面是根据前景图的操作,和原图像融合得到有纹理的前景图
GaussianBlur(fgMask, fgMask, Size(5, 5) , 0);
threshold(fgMask , fgMask, 10, 255, THRESH_BINARY);
// 将foreGraound 所有像素置为0
foreGround = Scalar::all(0);
//fgMask对应点像素值为255则 foreGround像素为image里的像素,为0则直接为0
image.copyTo(foreGround, fgMask);
pBgmodel->getBackgroundImage(backGround);
imshow("frame", frame);
imshow("backGround", backGround);
//imshow("foreGround", foreGround);
imshow("fgMask", fgMask);
char key = waitKey(100);
if (key == 27)//27 对应得assic 码是27
break;
}
}
注意:opencv 3.0 后版本没有了BackgroundSubtractorMOG
更多设置参数及注释参考如下:
// 背景模型影响帧数 默认为500
mod->setHistory(1000);
// 模型匹配阈值
mod->setVarThreshold(50);
// 阴影阈值
mod->setShadowThreshold(0.7);
// 前景中模型参数,设置为0表示背景,255为前景,默认值127
mod->setShadowValue(127);
// 背景阈值设定 backgroundRatio*history
mod->setBackgroundRatio(2);
// 设置阈值的降低的复杂性
mod->setComplexityReductionThreshold(0.02);
// 高斯混合模型组件数量
mod->setNMixtures(100);
// 设置每个高斯组件的初始方差
mod->setVarInit(0.5);
// 新模型匹配阈值
mod->setVarThresholdGen(9);