天天看点

CentOS环境下使用javaCV

最近一直搞计算机视觉,需要在linux环境下使用javaCV,感觉linux环境下使用javaCV还是很费劲的,可能是基础太差吧。在Windows上运行的程序,放到linux上就很难运行起来,还是怀念纯纯的java开发啊,主要说说遇到的一些问题吧。自己写了一个简单的小程序,用来提取图片中的SIFT描述子(当然是模仿的别人的)。

import org.bytedeco.javacpp.opencv_core.DMatchVector;
import org.bytedeco.javacpp.opencv_core.KeyPoint;
import org.bytedeco.javacpp.opencv_core.KeyPointVector;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Scalar;
import org.bytedeco.javacpp.opencv_xfeatures2d.*;
import org.bytedeco.javacpp.opencv_features2d;
import org.bytedeco.javacpp.opencv_features2d.BFMatcher;
import org.bytedeco.javacpp.opencv_features2d.DrawMatchesFlags;

import static org.bytedeco.javacpp.opencv_highgui.*;
import static org.bytedeco.javacpp.opencv_imgcodecs.*;


public class SIFTExtracor {

	
	public static void main(String[] args) {

		System.out.println(System.getProperty("java.library.path"));
		String fileName="/home/zhang/code/javacv/Shapes1.jpg";
		Mat img=imread(fileName);
		Mat img2=imread("/home/zhang/code/javacv/Shapes2.jpg");
		if(img.empty()){
			System.out.println("img is empty!");
		}
		if(img2.empty()){
			System.out.println("img2 is empty!");
		}
//		imshow("image before", img);
//		imshow("before image2", img2);
        
//		@SuppressWarnings("resource")
		SIFT sift=SIFT.create(0, 3, 0.03, 10, 1.6);
		KeyPointVector kp1 = new KeyPointVector();
		sift.detect(img, kp1);
        Mat outimg1 = new Mat();
      
        opencv_features2d.drawKeypoints(img, kp1, outimg1,new Scalar(255, 255, 255, 0), DrawMatchesFlags.DRAW_RICH_KEYPOINTS);
//        imshow("image1 key points", outimg1);
       
        for(long i=0;i<kp1.size();i++){
        	KeyPoint kp=kp1.get(i);
        	if(i==0)
        	System.out.println(kp.angle()+"\t"+kp.class_id()+"\t"+kp.octave()+"\t"+kp.pt().position()+"\t"+kp.response());
        }
        Mat outimg2=new Mat();
        KeyPointVector kp2 = new KeyPointVector();
        opencv_features2d.drawKeypoints(img2, kp2, outimg2);
//        imshow("image2 key points",outimg2);
        
		SIFT extractor=SIFT.create(0, 3, 0.03, 10, 1.6);
        Mat des1=new Mat();Mat des2=new Mat();
        extractor.compute(img, kp1, des1);
        extractor.compute(img2, kp2, des2);
//        imshow("desc", des1);
        DMatchVector matches=new DMatchVector();
        @SuppressWarnings("resource")
		BFMatcher matcher=new BFMatcher();
        Mat img_match=new Mat();
        matcher.match(des1, des2, matches);
        opencv_features2d.drawMatches(img, kp1, img2, kp2, matches, img_match);
        imshow("matches", img_match);
        waitKey();
        
	}

}
           

代码中主要用的是OpenCV的功能接口,需要调用本地方法。在CentOS中使用javaCV,需要先安装好对应版本的openCV。我用到的javacv版本是1.2版本的,所以openCV也是使用的2.4.12版本的,opencv编译好的库文件会默认存放到/usr/local/lib文件夹下。

1、在CentOS中使用eclipse开发,需要配置eclipse的native library location,我这里使用的是/usr/local/lib这个目录,就是opencv存放库文件的目录。此时运行代码还会出现错误,会显示java.library.path中缺少“xxx.so”库,一般是libjniopencv_core.so库,需要解压opencv-linux-x86_64.jar(前提是CentOS是64位的,如果是32位系统需要去opencv-linux-x86.jar中去找),找到缺少的so库,然后将这些库文件拷贝到/usr/local/lib目录中。

2、如果是运行jar包的话,在运行时需要指定本地运行库目录,使用 java -Djava.library.path="your path" -jar yourjar.jar命令执行jar包。

3、出现找不到GLIBC_2.14说明GLIBC版本不够,可以使用 strings /lib64/libc.so.6 | grep GLIBC 命令查询自己系统支持的GLIBC的版本,可以看一下这篇博客,关于升级GLIBC版本的问题(http://blog.csdn.net/officercat/article/details/39520227)

4、出现usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found,需要升级gcc版本,参考(https://github.com/qiwsir/ITArticles/blob/master/Linux/How_to_solve_GLIBCXX_3.4.19.md)。

继续阅读