gpt4 book ai didi

Java - 在 OpenCV 中读取帧

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:04 24 4
gpt4 key购买 nike

我刚刚开始在 java 中学习 openCV,并且我已经使用所有 OpenCV java 依赖项设置了我的 Eclipse IDE。

现在我有一个任务要从我以 .avi 文件格式录制的视频文件中提取单个帧。

我从这个搜索 link并使用下面给出的代码,

package vasanth;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;

public class Vasanth {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
VideoCapture camera = new VideoCapture("G:\\PICTURES\\roxtar vassy\\early days in APSCE.wmv");



/* if(!camera.isOpened()){
System.out.println("Error");
} */


Mat frame = new Mat();

while(true){
System.out.println("Looping.. \n");
if (camera.read(frame)){
System.out.println("Frame Obtained");
System.out.println("Captured Frame Width " +
frame.width() + " Height " + frame.height());
Highgui.imwrite("camera.jpg", frame);

System.out.println("OK");
break;
}
}
}

}

当我执行这个时,程序在这一行无限循环

camera.read(frame)

我也试过在没有循环的情况下运行这段代码,并成功地在我的系统上获取了 camera.jpg 文件,但文件已损坏。我知道这个帧没有完全提取所有像素,因此看起来已损坏。

所以这里的问题是为什么 camera.read(frame) 总是返回 false 并且循环从不中断?

我已经等了10多分钟了。我想要做的就是提取一个单帧,而这种方法不会发生这种情况。

根据我在谷歌上搜索的内容,我了解到有一个名为 ffmpeg 的工具,它以视频文件作为输入并给我帧。但是我想用我自己的在 Eclipse 上运行的 Java 代码为初学者实现这个功能。

最佳答案

在重现您的问题时我遇到了几个问题,所以让我来指导您解决这些问题。

  1. 首先,您使用的是旧版本的框架。目前是3.2的,考虑升级。我使用的是最新版本。

  2. 您不应该注释掉 camera.isOpened() 检查,因为如果相机没有打开,就没有继续进行的意义。我假设,您的应用程序无法通过该检查,因此您决定跳过该检查:) 但是为了正确打开相机,您应该执行 thisthis .第一个链接对我有用(唯一的变化是对于 3.2 版本,路径是 \opencv\build\x64\vc14\bin 并且我不得不重新启动计算机)

代码与您到目前为止的代码几乎相同,唯一不同的是最新版本:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

import javax.swing.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
import java.nio.file.Paths;

public class Vasanth {

public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
String filePath = "G:\\PICTURES\\roxtar vassy\\early days in APSCE.wmv";
if (!Paths.get(filePath).toFile().exists()){
System.out.println("File " + filePath + " does not exist!");
return;
}

VideoCapture camera = new VideoCapture(filePath);

if (!camera.isOpened()) {
System.out.println("Error! Camera can't be opened!");
return;
}
Mat frame = new Mat();

while(true){
if (camera.read(frame)){
System.out.println("Frame Obtained");
System.out.println("Captured Frame Width " +
frame.width() + " Height " + frame.height());
Imgcodecs.imwrite("camera.jpg", frame);
System.out.println("OK");
break;
}
}

BufferedImage bufferedImage = matToBufferedImage(frame);
showWindow(bufferedImage);
camera.release();
}

private static BufferedImage matToBufferedImage(Mat frame) {
int type = 0;
if (frame.channels() == 1) {
type = BufferedImage.TYPE_BYTE_GRAY;
} else if (frame.channels() == 3) {
type = BufferedImage.TYPE_3BYTE_BGR;
}
BufferedImage image = new BufferedImage(frame.width(), frame.height(), type);
WritableRaster raster = image.getRaster();
DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
byte[] data = dataBuffer.getData();
frame.get(0, 0, data);

return image;
}

private static void showWindow(BufferedImage img) {
JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(img)));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(img.getWidth(), img.getHeight() + 30);
frame.setTitle("Image captured");
frame.setVisible(true);
}
}

请注意,为了证明这段代码有效,我使用了简单的 Swing JFrame:

enter image description here

关于Java - 在 OpenCV 中读取帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42466646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com