2011-10-10 58 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/....並且它應該可以工作。