英文:
Java, OpenCV VideoWriter isOpened returns always false
问题
我正在使用Java OpenJdk 14.0.2和OpenCV-440,同时在Windows 10上运行。我的JavaFX应用程序应该捕获摄像头(或任何其他视频设备)的帧并将这些帧存储为视频文件,例如avi。
以下是我的代码:
public void run() {
Mat frame = new Mat();
VideoCapture videoCapture = new VideoCapture(0);
videoCapture.read(frame);
Size frameSize = new Size((int) videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH), (int) videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT));
int fourcc = VideoWriter.fourcc('x', '2', '6', '4');
VideoWriter writer = new VideoWriter();
//如果myuniquefile%02d.jpg使用任何一种视频扩展名而不是jpg,则不起作用(例如avi)
writer.open("images/myuniquefile%02d.jpg", fourcc,
videoCapture.get(Videoio.CAP_PROP_FPS), frameSize, true);
while (isRunning) {
if (videoCapture.read(frame)) {
writer.write(frame);
}
}
videoCapture.release();
writer.release();
}
这段代码运行良好,但只要我将“.jpg”更改为.avi等扩展名,它就不再工作。对于上面的代码,VideoWriter.isOpened()返回true,对于带“.avi”的相同代码,返回false。我尝试了许多文件扩展名和编解码器(VideoWriter.fourcc)的组合,但从未成功打开。
让我们继续看我的设置,我正在使用Intellij(2020.1.2),并且openCV 440是这样链接的:
唯一的附加库是javafx-sdk-14.0.2.1
我一开始参考了这个示例,但对我来说从未按照那种方式工作过。
我非常感谢任何建议。
BR Michael
英文:
I am using Java OpenJdk 14.0.2 and OpenCV-440 as well while everything is running on Windows 10. My JavaFX application is supposed to capture the frames of a webcam (or any other video device) and store the frames as a video file, for example avi.
Here is my code:
public void run() {
Mat frame = new Mat();
VideoCapture videoCapture = new VideoCapture(0);
videoCapture.read(frame);
Size frameSize = new Size((int) videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH), (int) videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT));
int fourcc = VideoWriter.fourcc('x', '2','6','4');
VideoWriter writer = new VideoWriter();
//if myuniquefile%02d.jpg is using any kind of video extension instead, it is not working (e.g. avi)
writer.open("images/myuniquefile%02d.jpg", fourcc,
videoCapture.get(Videoio.CAP_PROP_FPS), frameSize, true);
while (isRunning) {
if (videoCapture.read(frame)) {
writer.write(frame);
}
}
videoCapture.release();
writer.release();
}
This code is working fine, but as soon I change the ".jpg" to an extension like .avi it is not working any longer. For the code above VideoWriter.isOpened() returns true and for the same code with ".avi" it returns false. I tried a lot of combinations of file extensions and codecs (VideoWriter.fourcc), but it is never open.
Lets go ahead to my settings, I am using Intellij (2020.1.2) and openCV 440 is linked this way:
The only additional lib is the javafx-sdk-14.0.2.1
I was going with this example in the first place, but it was never working that way for me.
I am very grateful for any suggestions
BR Michael
答案1
得分: 4
因为您正在创建H264
编解码器的VideoWriter
,但尝试获取.avi
编解码器的视频。
以下是正确的.avi
或.mp4
编解码器格式:
int fourcc = VideoWriter.fourcc('M', 'J', 'P', 'G');
writer.open("images/out.avi", fourcc,
videoCapture.get(Videoio.CAP_PROP_FPS), frameSize, true);
这里有一个类似的问题,还有OpenCV文档中关于VideoWriter的信息。
英文:
Because you are creating H264
codec VideoWriter
but trying to get .avi
codec video.
Here is the correct codec format for .avi or .mp4:
int fourcc = VideoWriter.fourcc('M', 'J','P','G');
writer.open("images/out.avi", fourcc,
videoCapture.get(Videoio.CAP_PROP_FPS), frameSize, true);
Here is similar problem and also opencv documentation for VideoWriter
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论