作者LGham (老大叉)
看板C_and_CPP
标题[问题] 利用opencv对影片做背景相减
时间Sun Mar 19 12:55:10 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
win7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
c++/c
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
opencv
问题(Question):
我在网路上有看到可以将图片与图片做相减
再利用二值化可以得到我想要的特徵物
我现在是把影片切成一个一个frame再下去做相减看看效果如何
请问该怎麽直接输入影片直接做背景相减呢
小弟对影像处理只是刚入门 程度不佳 希望各位指点迷津
程式码如下
http://tim12332013.blogspot.tw/2013/10/opencvcvabsdiffimg1img2img3.html
喂入的资料(Input):
图片
预期的正确结果(Expected Output):
希望能直接对此程式码输入影片然後跑动
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
void BW(IplImage* img, int RGB)//二值化
{
int Height = cvGetDimSize(img, 0);
int Width = cvGetDimSize(img, 1);
for (int y = 0; y < Height; y++)
for (int x = 0; x < Width; x++)
{
if (!(cvGet2D(img, y, x).val[2] < RGB
&& cvGet2D(img, y, x).val[1] < RGB
&& cvGet2D(img, y, x).val[0] < RGB))
cvSet2D(img, y, x, CV_RGB(255, 255, 255));
else
cvSet2D(img, y, x, CV_RGB(0, 0, 0));
}
}
int main(int argc, char *argv[])
{
cvNamedWindow( "Example", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateFileCapture( argv[1] );
IplImage* frame;
while(1)
{
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example", frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example" );
IplImage* img1, *img2, *img3;
img1 = cvLoadImage("E:/20170313/1.png", -1);
img2 = cvLoadImage("E:/20170313/24.png", -1);
if (!img1 || !img2)
{
printf("Could not load image file\n");
system("pause");
exit(0);
}
img3 = cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels);
cvSmooth(img1, img1, CV_GAUSSIAN, 3, 0, 0);
cvSmooth(img2, img2, CV_GAUSSIAN, 3, 0, 0);
cvAbsDiff(img1, img2, img3);
printf("goal",cvAbsDiff);
int Height = cvGetDimSize(img3, 0);
int Width = cvGetDimSize(img3, 1);
BW(img3, 50);
cvErode(img3, img3, 0, 1);
cvDilate(img3, img3, 0, 1);
cvSaveImage("E:/20170313/yes.png", img3);
cvNamedWindow("img1", CV_WINDOW_AUTOSIZE);
cvNamedWindow("img2", CV_WINDOW_AUTOSIZE);
cvNamedWindow("img3", CV_WINDOW_AUTOSIZE);
cvShowImage("img1", img1);
cvShowImage("img2", img2);
cvShowImage("img3", img3);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&img3);
return 0;
}
补充说明(Supplement):
我试着用CvCapture,cvQueryFrame并利用while回圈不断读取frame
但是都读不出影片,不知道我用的方法是不是可行的
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.116.40.159
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1489899313.A.1F1.html
1F:嘘 Sidney0503: 作业自己做 03/19 13:54
2F:→ wtchen: 你拿别人的程式码,没有自己的心得,这样算伸手文喔 03/19 17:24
3F:→ wtchen: 给你两小时补充,不然砍文 03/19 17:24
※ 编辑: LGham (218.164.42.120), 03/19/2017 19:45:32
4F:嘘 grayStone: docs.opencv.org 03/19 23:16
5F:→ wtchen: 你好歹也附个自己的程式码.... 03/19 23:47
※ 编辑: LGham (140.116.40.159), 03/20/2017 10:16:57
6F:→ unosis: 好像来问opencv的99%都是.. 03/20 11:38
7F:→ escrowdis: Google一下 满山满谷 03/22 09:11