2011-10-10 57 views
1

我测试了一个程序,该程序根据LTI CIVIL库从网络摄像头拍摄照片并每2秒保存一次。该方案的工作非常出色在Windows Vista,但是当我跑了它在Ubuntu下我得到了一个错误:如何让这个LTI CIVIL示例代码在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下运行?

+2

'线程中的异常“main”com.lti.civil.CaptureException:java.lang.UnsatisfiedLinkError:java.library.path'中没有任何内容告诉你问题是什么。它无法找到民间动态图书馆。在Ubuntu上检查LD_LIBRARY_PATH以确保.so文件被正确拾取。 – arunkumar

+0

对不起,我在ubuntu的知识是有限的。我应该如何找到LD_LIBRARY_PATH?我搜索它,我什么也没找到 –

+0

我想在Ubuntu上运行lti-civil代码。我面临同样的问题。为了解决这个问题,我将所需的libcivil.so文件放在我的项目根目录下,并安装了libstdC++。so.5(sudo apt-get install libstdC++ 5)。我能够运行的代码,但我得到以下错误:打开V4L2设备 找到集成网络摄像头卡uvcvideo V4L2驱动 discover_inputs() 找到来源:1 \t 0 - 照相机1(2) 未知或不支持的格式:1448695129 – vaibhav

回答

2

下载并查看文件后,它看起来像你想要的是在lti-civil/native目录中。根据你的linux版本,有linux-amd64和linux-x86。现在你可以使用两种方式来做事情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/....并且它应该可以工作。