Opencv读取视频文件的几个问题及解决方法(读入空Mat,访问冲突)

来源:互联网 发布:linux mmap shm 编辑:程序博客网 时间:2024/06/16 13:31

在录制视频再读入处理的过程中遇到了一些小问题,附上解决过程。



首先Opencv读取视频很方便,直接把读摄像头的参数改成视频路径即可。

VideoCapture cap(0);//读取摄像头的代码
改成

VideoCapture cap("1.avi");//1.avi为调试目录下的一个文件,也可以"C:\\1.avi"类似的绝对路径


很直观地imshow一下就可以看到结果。


但运行过程中遇到了两个问题:

1.获取cap的帧数和真正imshow的不匹配(可能是我录制视频软件的问题?),以我测试的视频为例,最后8帧读入的都是空的,再imshow便会出问题。




各位有兴趣可以下载我测试的视频尝试一下(包含测试代码):http://download.csdn.net/detail/zmdsjtu/9709042


【解决方法】try-catch了一下(详情见下方代码)


2.视频播放结束之后有访问冲突(这真的是一个非常头疼的问题……)



【解决方案一】调用destroyAllWindows()就不报错了,还没搞清楚原因,代码如下:

#include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp>  #include <opencv2/core/core.hpp>  #include<thread>#include<iostream>using namespace cv;int main(){VideoCapture cap("1.avi");Mat frame;int 帧数 = cap.get(CAP_PROP_FRAME_COUNT);//7try {while (waitKey(50) != 27 && 帧数-- >0){cap >> frame;//if (frame.empty())break;imshow("调用摄像头", frame);}}catch (cv::Exception&e){std::cout << e.what() << std::endl << 帧数 << std::endl;};cv::destroyAllWindows();//Destroy窗口就不报错了……//system("pause");return 0;}


【解决方法二】开启一个线程

#include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp>  #include <opencv2/core/core.hpp>  #include<thread>#include<iostream>using namespace cv;int main(){std::thread 另开一个线程不报错([&] {VideoCapture cap("1.avi");Mat frame;int 帧数 = cap.get(CAP_PROP_FRAME_COUNT);//7try {while (waitKey(50) != 27 && --帧数 != 0){cap >> frame;imshow("调用摄像头", frame);waitKey(30) != 27;}}catch (cv::Exception&e){std::cout << e.what() << std::endl << 帧数 << std::endl;} });另开一个线程不报错.join();return 0;}


祝Opencv使用愉快:)





0 0
原创粉丝点击