如何在Ubuntu下运行此LTI CIVIL示例代码?

时间:2011-10-10 12:53:59

标签: java ubuntu

我测试了一个程序,该程序从网络摄像头拍摄照片,并根据LTI CIVIL库每2秒保存一次。该程序在Windows Vista下运行良好,但是当我在Ubuntu下运行时出现错误:

run:
Exception in thread "main" com.lti.civil.CaptureException:java.lang.UnsatisfiedLinkError: no civil in java.library.path
    at com.lti.civil.impl.jni.NativeCaptureSystemFactory.createCaptureSystem(NativeCaptureSystemFactory.java:24)
    at emptyroomoperation_final.Camera.main(Camera.java:41)
    Caused by: java.lang.UnsatisfiedLinkError: no civil in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1028)
    at com.lti.civil.impl.jni.NativeCaptureSystemFactory.createCaptureSystem(NativeCaptureSystemFactory.java:21)
    ... 1 more
Java Result: 1

以下是代码:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package emptyroomoperation_final;

import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.util.List;

import com.lti.civil.CaptureDeviceInfo;
import com.lti.civil.CaptureException;
import com.lti.civil.CaptureObserver;
import com.lti.civil.CaptureStream;
import com.lti.civil.CaptureSystem;
import com.lti.civil.CaptureSystemFactory;
import com.lti.civil.DefaultCaptureSystemFactorySingleton;
import com.lti.civil.Image;
import com.lti.civil.VideoFormat;
import com.lti.civil.awt.AWTImageConverter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
*
* @author Ken Larson
*/
public class Camera
{
    static public String s;
    static int w=0;  
    //static File f1 = new File("C:\\Users\\mostafa\\Documents\\NetBeansProjects   \\EmptyRoomOperation\\0.jpg") ;
    // static File f2 = new File("C:\\Users\\mostafa\\Documents\\NetBeansProjects\\EmptyRoomOperation\\") ;
    public static void main(String[] args) throws CaptureException
    {
        CaptureSystemFactory factory = DefaultCaptureSystemFactorySingleton.instance();
        CaptureSystem system = factory.createCaptureSystem();
        system.init();
        List list = system.getCaptureDeviceInfoList();
        for (int i = 0; i < list.size(); ++i)
        {
            CaptureDeviceInfo info = (CaptureDeviceInfo) list.get(i);

            System.out.println("Device ID " + i + ": " + info.getDeviceID());
            System.out.println("Description " + i + ": " + info.getDescription());

            CaptureStream captureStream = system.openCaptureDeviceStream(info.getDeviceID());

            System.out.println("Current format " + videoFormatToString(captureStream.getVideoFormat()));

            captureStream.setObserver(new MyCaptureObserver());
            System.out.println("Available formats:");
            for (VideoFormat format : captureStream.enumVideoFormats())
            {
                System.out.println(" " + videoFormatToString(format));
            }

            final int MAX_FORMATS = 2;
            int count = 0;
            //for (VideoFormat format : captureStream.enumVideoFormats())//not now
            VideoFormat format = captureStream.enumVideoFormats().get(0);//alternative of the above
            int k=0;

            while(k!=10)
            {
                /*if (count > MAX_FORMATS)
                {    System.out.println("Stopping after " + MAX_FORMATS + " formats.");    // could be a lot
                    break;
                }*/
                System.out.println("Choosing format: " + videoFormatToString(format));
                captureStream.setVideoFormat(format);
                s = new String(""+w);
                // File f2 = new File("C:\\Users\\mostafa\\Documents\\NetBeansProjects\\EmptyRoomOperation\\"+s+".jpg") ;

                //  f1.
                System.out.println("Capturing for 2 seconds...");
                captureStream.start();
                try
                {
                    Thread.sleep(2000);
                }
                catch (InterruptedException e)
                {
                    return;
                }

                captureStream.stop();
                /*try {
                   // Thread.sleep(10000);
                } catch (Exception ex) {
                    Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex);
                }*/
                //++count;
                w++;
            }
            System.out.println("disposing stream...");
            captureStream.dispose();

        }
        System.out.println("disposing system...");
        system.dispose();
        System.out.println("done.");
    }

    public static String videoFormatToString(VideoFormat f)
    {
        return "Type=" + formatTypeToString(f.getFormatType()) + " Width=" + f.getWidth() + " Height=" + f.getHeight() + " FPS=" + f.getFPS();
    }

    private static String formatTypeToString(int f)
    {
        switch (f)
        {
            case VideoFormat.RGB24:
                return "RGB24";
            case VideoFormat.RGB32:
                return "RGB32";
            default:
                return "" + f + " (unknown)";
        }
    }

}

class MyCaptureObserver implements CaptureObserver
{
    public void onError(CaptureStream sender, CaptureException e)
    {    System.err.println("onError " + sender);
        e.printStackTrace();
    }

    public void onNewImage(CaptureStream sender, Image image)
    {
        final BufferedImage bimg;
        try
        {
            final VideoFormat format = image.getFormat();
            System.out.println("onNewImage format=" + Camera.videoFormatToString(format) + " length=" + image.getBytes().length);
            bimg = AWTImageConverter.toBufferedImage(image);
        }
        catch (Exception e)
        {    e.printStackTrace();
            return;
        }

        // Encode as a JPEG
        try
        {
            FileOutputStream fos = new FileOutputStream(Camera.s+".jpg");
            JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
            jpeg.encode(bimg);
            fos.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

注意:这与LTI CIVIL附带的测试代码几乎相同,但有一些修改。

据我了解,LTI CIVIL应该也可以在Ubuntu下运行。如何让这段代码在Ubuntu下运行?

1 个答案:

答案 0 :(得分:2)

下载并查看文件后,看起来您想要的文件位于lti-civil / native目录中。有linux-amd64和linux-x86取决于你的linux版本。现在你可以用两种方式做事了LD_LIBRARY_PATH是一个环境变量,你可以设置它指向你希望linux搜索动态库的目录。

建议的另一个选项是执行以下操作。创建/etc/ld.so.conf.d/civil.conf。该文件应该只有一行,其中包含解压缩或提取lti-civil / native / linux-xxx / lib * .so文件的路径。您需要root访问权限或sudo访问权限才能执行此操作。如果你没有访问权限,那么将LD_LIBRARY_PATH设置为lti-civil / native / ....它应该可以工作。