我一直在尝试从凸轮捕获视频并将其写入AVI文件。我在Windows 7上使用Qt 4.8.2和MSVC 2010(x86)。我有两个版本的代码:一个使用cv :: Mat,另一个使用IplImage *。但是,只有IplImage *版本正在运行。这是我的代码使用cv :: Mat:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
VideoCapture* capture2 = new VideoCapture( CV_CAP_DSHOW );
Size size2 = Size(640,480);
int codec = CV_FOURCC('M', 'J', 'P', 'G');
VideoWriter* writer2 = new VideoWriter("video.avi",codec,15,size2);
int a = 100;
Mat frame2;
while ( a > 0 ) {
capture2->read(frame2);
writer2->write(frame2);
a--;
}
writer2->release();
capture2->release();
return 0;
}
这是使用IplImage *的代码:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main() {
CvCapture* capture = cvCaptureFromCAM( CV_CAP_DSHOW );
CvSize size = cvSize(640,480);
int codec = CV_FOURCC('M', 'J', 'P', 'G');
CvVideoWriter* writer = cvCreateVideoWriter("video.avi",codec,15,size);
int a = 100;
while ( a > 0 ) {
IplImage* frame = cvQueryFrame( capture );
cvWriteToAVI(writer,frame);
a--;
}
cvReleaseVideoWriter(&writer);
cvReleaseCapture( &capture );
return 0;
}
它基本上是相同的,或者至少对我来说看起来是一样的。它读取100帧,并应将它们写入“video.avi”。它编译并运行没有错误,但cv :: Mat版本没有写任何东西,IplImage *版本完美运行。
有人知道发生了什么事吗?
答案 0 :(得分:8)
Opencv C ++参考中的语法略有不同,这里是C ++中的工作代码。 我刚刚添加了imshow和waitkey,如果你愿意,可以删除它们。
int main()
{
VideoCapture* capture2 = new VideoCapture(CV_CAP_DSHOW);
Size size2 = Size(640, 480);
int codec = CV_FOURCC('M', 'J', 'P', 'G');
// Unlike in C, here we use an object of the class VideoWriter//
VideoWriter writer2("video_.avi", codec, 15.0, size2, true);
writer2.open("video_.avi", codec, 15.0, size2, true);
if (writer2.isOpened())
{
int a = 100;
Mat frame2;
while (a > 0)
{
capture2->read(frame2);
imshow("live", frame2);
waitKey(100);
writer2.write(frame2);
a--;
}
}
else
{
cout << "ERROR while opening" << endl;
}
// No Need to release the Writer as the distructor will called automatically
capture2->release();
return 0;
}
答案 1 :(得分:0)
我一遍又一遍地遇到同样的问题,我在网上找到的解决方案都没有帮助。
奇怪的是,问题(纯粹使用试错法确定)具有写入权限。在sudo chmod u+rwx
python脚本之后,一切都有效。
答案 2 :(得分:0)
我遇到了同样的问题,过了一段时间,我意识到输入视频与输出视频大小不一样。调整输入视频的大小可能对您有所帮助。
capture2->read(frame2);
cv::resize(frame2,frame2,cv::Size(640,480);
writer2->write(frame2);