Visual c++ 如何在背景减法器模型中使用捕获的视频播放和检测对象?
大家好。!我正在使用opencv2.4.2。实际上我正在做一个关于物体检测的项目。我试着使用背景模型。 但我无法从我的计算机加载视频文件。在实时运行时,下面的代码可以很好地进行分段。 我已经实现了使用帧差分方法进行目标检测。现在我想从背景中分割出整个物体。我有静态背景。所以,有谁能在下面的代码中帮助我如何从捕获的视频中分割对象。还有如何加载视频文件? 多谢各位Visual c++ 如何在背景减法器模型中使用捕获的视频播放和检测对象?,visual-c++,opencv,image-processing,Visual C++,Opencv,Image Processing,大家好。!我正在使用opencv2.4.2。实际上我正在做一个关于物体检测的项目。我试着使用背景模型。 但我无法从我的计算机加载视频文件。在实时运行时,下面的代码可以很好地进行分段。 我已经实现了使用帧差分方法进行目标检测。现在我想从背景中分割出整个物体。我有静态背景。所以,有谁能在下面的代码中帮助我如何从捕获的视频中分割对象。还有如何加载视频文件? 多谢各位 #包括“stdafx.h” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/
#包括“stdafx.h” #包括“opencv2/imgproc/imgproc.hpp” #包括“opencv2/highgui/highgui.hpp” #包括“opencv2/contrib/contrib.hpp” #包括“conio.h” #包括“time.h” #包括“opencv/cvaux.hpp” #包括“opencv2/core/core.hpp” #包括“opencv2/calib3d/calib3d.hpp” 使用名称空间std; 使用名称空间cv; int main(int argc,字符**argv) { //IplImage*tmp_框架; //std::string arg=argv[1]; //视频捕获(); cv::视频捕获帽; /*CvCapture*cap=cvCaptureFromFile(“S:\\offline object detection database\\SINGLE PERSON database\\video4.avi”); 如果(!cap){ printf(“捕获失败\n”); 返回-1; } IplImage*frame=0; 框架=cvQueryFrame(cap); 如果(!帧) 返回-1*/ bool update_bg_model=true; 如果(argc<2) 上限开放(0); 其他的 cap.open(std::string(argv[1]); 如果(!cap.isOpened()) { printf(“无法打开相机或视频文件”); 返回-1; } Mat tmp_框架,bgmask; cap>>tmp_框架; 如果(!tmp_frame.data) { printf(“无法从视频源读取数据\n”); 返回-1; } namedWindow(“视频”,1); 名称(“分段”,1); 背景减法器MOG BG减法器; 对于(;;) { //双t=(双)cvGetTickCount(); cap>>tmp_框架; 如果(!tmp_frame.data) 打破 bg减法器(tmp_帧、bg掩码、更新_bg_模型?-1:0); //t=(双)cvGetTickCount()-t; //printf(“%d.%.1f\n”,fr,t/(cvGetTickFrequency()*1000.); imshow(“视频”,tmp_帧); imshow(“分段”,bgmask); char-keycode=waitKey(30); 如果(keycode==27)中断; 如果(键代码=“”) 更新_bg_模型=!更新_bg_模型; } 返回0; }
- opencv中的视频加载对我来说很有用。要加载视频,可以尝试以下方法。捕获帧后,可以在循环中进行处理,也可以调用单独的函数
std::cout<<"Video File "<<argv[1]<<std::endl;
cv::VideoCapture input_video(argv[1]);
namedWindow("My_Win",1);
Mat cap_img;
while(input_video.grab())
{
if(input_video.retrieve(cap_img))
{
imshow("My_Win", cap_img);
/* Once you have the image do all the processing here */
/* Or Call your image processing function */
waitKey(1);
}
}
std::couthi..谢谢你的回复。但实际上它并没有打开一个视频文件。正如您在我的代码中看到的:for(;){//double t=(double)cvGetTickCount();cap>>tmp_frame;//它在“>>中给出了错误这行。不知道为什么。使用MAt定义播放视频还有其他方法吗?或者有错误吗?请指导我。谢谢。上面的代码对我有效,我可以加载视频并播放它。我认为你应该检查正在加载的文件名。它是正确的文件吗。在windows上,你还需要使用\\而不是of\.e.g const char*my\u file=“C:\\my\u Folder\\my\u file.mpg”:类似的东西我也试过你的代码,但不是所有的东西都是文件打开部分和帧读取。它对我有效,我觉得你可以看看你传递的文件名。正如我在windows上说的,你需要使用双斜杠“\”作为文件夹分隔符。您好:@praks411;我运行了上面的代码。它对笔记本电脑摄像头工作正常。对于实时应用程序来说是指。但正如您所说,我也尝试过使用const char,但在:cap>>tmp_frame;和关闭应用程序时出现了错误。不知道如何加载?您可以参考我新编辑的代码,如果您能够成功打开文件,那么它会出错uld工作。上面的代码在VisualStudio2010 OpenCV2_4_3上对我有效
std::cout<<"Video File "<<argv[1]<<std::endl;
cv::VideoCapture input_video(argv[1]);
namedWindow("My_Win",1);
Mat cap_img;
while(input_video.grab())
{
if(input_video.retrieve(cap_img))
{
imshow("My_Win", cap_img);
/* Once you have the image do all the processing here */
/* Or Call your image processing function */
waitKey(1);
}
}
int main(int argc, char*argv[])
{
char *my_file = "C:\\vid_an2\\desp_me.avi";
std::cout<<"Video File "<<my_file<<std::endl;
cv::VideoCapture input_video;
if(input_video.open(my_file))
{
std::cout<<"Video file open "<<std::endl;
}
else
{
std::cout<<"Not able to Video file open "<<std::endl;
}
namedWindow("My_Win",1);
namedWindow("Segemented", 1);
Mat cap_img;
for(;;)
{
input_video >> cap_img;
imshow("My_Win", cap_img);
waitKey(0);
}
return 0;
}