C++ 使用opencv获取帧视频
这是我从视频中获取帧的代码。我想在视频中显示2帧循环和条件C++ 使用opencv获取帧视频,c++,opencv,video-processing,C++,Opencv,Video Processing,这是我从视频中获取帧的代码。我想在视频中显示2帧循环和条件 int main( int argc, char** argv ) { string fileName = "E:\\Tugas Akhir\\Video Master\\city_1.avi"; Mat image1; Mat image2; Mat frame; cv::Mat result; VideoCapture cap(fileName);
int main( int argc, char** argv )
{
string fileName = "E:\\Tugas Akhir\\Video Master\\city_1.avi";
Mat image1;
Mat image2;
Mat frame;
cv::Mat result;
VideoCapture cap(fileName);
if(!cap.isOpened())
return -1;
Mat edges;
for(int loop=0;;loop++)
{
//std::cout<<loop<<endl;
cap >> frame; // get a new frame from camera
if(loop>0 && (loop%20)==0){
//std::cout<<"frame 2"<<endl;
image2=frame;
**imshow("image2",image2);**
break;
}else if(loop==0){
image1=frame;
**imshow("image1",image1);**
//std::cout<<"frame 1"<<endl;
}
//loop++;
if(waitKey(30) >= 0) break;
}
waitKey(0);
return 0;
}
int main(int argc,char**argv)
{
string fileName=“E:\\Tugas Akhir\\Video Master\\city_1.avi”;
Mat图像1;
Mat图像2;
垫架;
cv::Mat结果;
视频捕获cap(文件名);
如果(!cap.isOpened())
返回-1;
垫边;
for(int-loop=0;loop++)
{
//std::cout这样的作业:
image1 = frame;
只进行浅层复制。复制Mat结构,共享像素
因此,在第二个示例中,您正在使用当前帧覆盖image1。如果要“缓存”垫,请使用:
image1 = frame.clone(); // deep copy
像这样的任务:
image1 = frame;
只进行浅层复制。复制Mat结构,共享像素
因此,在第二个示例中,您正在使用当前帧覆盖image1。如果要“缓存”垫,请使用:
image1 = frame.clone(); // deep copy
实际上,您所面临的是OpenCV Mat中重载的=
运算符缺少对的支持。这基本上意味着image1
和frame
将共享它们的数据
一种方便的方法是,当您编写称为“浅层复制”的image1=frame
时,您正在为Matframe
创建一个引用image1
。因此,经过20次迭代后,当您显示image1
时,实际上是在显示frame
本身
如果您编写了类似于image1=frame.clone()
,则不会出现这种情况,因为在这种情况下,您实际上是在制作frame
的单独副本
另外,请查看。您面临的问题本质上是OpenCV Mat中重载的=
操作符缺乏支持。这基本上意味着image1
和frame
将共享它们的数据
一种方便的方法是,当您编写称为“浅层复制”的image1=frame
时,您正在为Matframe
创建一个引用image1
。因此,经过20次迭代后,当您显示image1
时,实际上是在显示frame
本身
如果您编写了类似于image1=frame.clone()
,则不会出现这种情况,因为在这种情况下,您实际上是在制作frame
的单独副本
另请查看。不清楚您将要做什么。不清楚您将要做什么。此外,您可以使用Mat::copyTo()方法深度复制Mat。另一种方法是在原始Mat上使用任何操作(例如a=1.0*B;或a=B+0.0;将B中的数据复制到a)。此外,您还可以使用Mat::copyTo()深度复制Mat的方法。另一种方法是在原始Mat上使用任何操作(例如,a=1.0*B;或a=B+0.0;将B中的数据复制到a)。