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

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



首先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);//7
	try {
	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);//7
		try {
			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使用愉快:)





  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱铭德

五毛也是爱٩(●´৺`●)૭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值