在录制视频再读入处理的过程中遇到了一些小问题,附上解决过程。
首先Opencv读取视频很方便,直接把读摄像头的参数改成视频路径即可。
VideoCapture cap(0);//读取摄像头的代码
改成
VideoCapture cap("1.avi");//1.avi为调试目录下的一个文件,也可以"C:\\1.avi"类似的绝对路径
但运行过程中遇到了两个问题:
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使用愉快:)