我正在使用以下代码从文件中读取视频,应用canny edge算法并将修改后的视频写入文件。代码编译和运行完美。但是,视频不是写的!我完全糊涂了。请告诉我错误是什么。 该文件根本没有创建!操作系统:Ubuntu 12.10
写入输出文件的代码
打开输出文件
bool setOutput(const std::string &filename, int codec=0, double framerate=0.0, bool isColor=true) {
outputFile= filename;
extension.clear();
if (framerate==0.0)
framerate= getFrameRate(); // same as input
char c[4];
// use same codec as input
if (codec==0) {
codec= getCodec(c);
}
// Open output video
return writer.open(outputFile, // filename
codec, // codec to be used
framerate, // frame rate of the video
getFrameSize(), // frame size
isColor); // color video?
}
编写框架
void writeNextFrame (Mat& frame)
{
writer.write (frame);
}
还有一个单独的run方法执行这些
答案 0 :(得分:5)
每当我在我的应用程序中遇到奇怪的行为时,我会写一个short, self contained, correct (compilable), example来帮助我了解正在发生的事情。
我编写了下面的代码来说明你应该做什么。值得注意的是,它在我的Mac OS X上完美运行:
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
// Load input video
cv::VideoCapture input_cap("Wildlife.avi");
if (!input_cap.isOpened())
{
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
// Setup output video
cv::VideoWriter output_cap("output.avi",
input_cap.get(CV_CAP_PROP_FOURCC),
input_cap.get(CV_CAP_PROP_FPS),
cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));
if (!output_cap.isOpened())
{
std::cout << "!!! Output video could not be opened" << std::endl;
return -1;
}
// Loop to read frames from the input capture and write it to the output capture
cv::Mat frame;
while (true)
{
if (!input_cap.read(frame))
break;
output_cap.write(frame);
}
// Release capture interfaces
input_cap.release();
output_cap.release();
return 0;
}
用FFmpeg检查输入文件显示(ffmpeg -i Wildlife.avi
):
Input #0, avi, from 'Wildlife.avi':
Metadata:
ISFT : Lavf52.13.0
Duration: 00:00:07.13, start: 0.000000, bitrate: 2401 kb/s
Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, PAR 1:1 DAR 16:9, 29.97 tbr, 29.97 tbn, 29.97 tbc
Stream #0.1: Audio: mp3, 44100 Hz, 2 channels, s16, 96 kb/s
和输出:
Input #0, avi, from 'output.avi':
Metadata:
ISFT : Lavf52.61.0
Duration: 00:00:07.10, start: 0.000000, bitrate: 3896 kb/s
Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, 29.97 tbr, 29.97 tbn, 29.97 tbc
因此,两个文件之间唯一重要的变化是OpenCV生成的输出没有音频流,这是正确的行为,因为OpenCV不处理音频。
确保您的用户具有在运行应用程序的目录中读/写/执行的适当权限。此外,我在代码中添加的调试可能会帮助您找到与输入/输出捕获相关的问题。
答案 1 :(得分:2)
你的机器上安装了FFMPEG库吗?在Linux上,FFMPEG用于编写视频;在Windows FFMPEG或VFW上使用。按命令检查
ffmpeg -version
尝试安装其他库
sudo apt-get install libavformat-dev libswscale-dev
。
通过调用writer.open,您只需初始化或重新初始化视频编写器。您必须调用void VideoWriter :: write(const Mat&amp; image)将下一个视频帧写入文件。我希望这会奏效。
答案 2 :(得分:0)
我遇到了同样的问题,我将编解码器更改为DIVX。现在,视频以.avi和.mp4格式保存。