OpenCV 2.4.4 Java - 抓取网络摄像头图片/视频流(MacOS)

5
我是一个新手,涉及到Stackoverflow和OpenCV编程。我已经使用Java的OpenCV绑定制作了一些项目(opencv.org官方,而不是JavaCV),例如通过ORB和SURF特征进行对象识别,处理图像,一切都好。现在我想要在视频流中进行对象识别。我想从网络摄像头中获取视频流并应用对象识别。由于我不是Java专家,所以我在OpenCV中找到了VideoCapture类,但我无法从摄像头中获取图片。
我正在使用OpenCV 2.4.4绑定在OSX Mountain Lion上,在Eclipse中运行我的项目。
控制台输出结果:
Hello, OpenCV
Camera OK?
Frame Obtained
Captured Frame Width 0
Invalid memory access of location 0x7fae00000000 rip=0x7fff8b4c5263

代码:

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

public class Webcam {

    public static void main (String args[]){

    System.out.println("Hello, OpenCV");
    // Load the native library.
    System.loadLibrary("opencv_java244");

    VideoCapture camera = new VideoCapture(0);
    camera.open(0); //Useless
    if(!camera.isOpened()){
        System.out.println("Camera Error");
    }
    else{
        System.out.println("Camera OK?");
    }

    Mat frame = new Mat();

    //camera.grab();
    //System.out.println("Frame Grabbed");
    //camera.retrieve(frame);
    //System.out.println("Frame Decoded");

    camera.read(frame);
    System.out.println("Frame Obtained");

    /* No difference
    camera.release();
    */

    System.out.println("Captured Frame Width " + frame.width());

    Highgui.imwrite("camera.jpg", frame);
    System.out.println("OK");
    }
}

尝试将图像编码为 .png 格式。 - Andrey Kamaev
问题不在于图像格式。控制台显示图像宽度为0。将图像格式更改为PNG会将控制台中的最后一行更改为:“libpng警告:IHDR中的图像宽度为零”;“libpng警告:IHDR中的图像高度为零”;“libpng错误:无效的IHDR数据”。 - Alessandro Gaietta
1
已解决。问题很简单,相机需要时间来初始化。我在“VideoCapture camera = new VideoCapture(0);”后面添加了“Thread.sleep(1000);”。 - Alessandro Gaietta
既然您找到了解决方案,请将其发布为答案。 - efaj
1
我从我的网络摄像头得到了一张完全黑色的图像。 网络摄像头显示它已经打开。 但是检查图像,图像中什么都没有。 你能帮忙吗? - Milinda Bandara
3个回答

8
问题很简单,相机需要时间来初始化。我已经添加了代码。
Thread.sleep(1000);

之后

VideoCapture camera = new VideoCapture(0);

3
我在MacOS上尝试了这段代码,发现另一个错误。
System.loadLibrary("opencv_java244");

上面的代码返回了这个错误。
java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.VideoCapture_2(I)J

为了克服这个问题,我用这一行替换了那一行。
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

代码可以正常运行!

我正在使用 OpenCV 2.4.8,在我的 Eclipse 项目中将其作为用户库引入。


对于其他人:我也遇到了UnsatisfiedLinkError的一些问题。我错过了将用户库的“本地库位置”设置为“<opencv-install-path>/lib”的步骤。希望这能帮助到某些人。 - Christof

3


System.loadLibrary("opencv_java244");
替换为
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接