opencvjava
㈠ 在java环境下编写opencv,用哪款java软件比较好
本来是要写一个简单的Base64编码程序,把一个图像文件利用Base64编码转换成一个txt文档;由于之前一直用C++做图像处理,所以对OpenCV各种恋恋不舍,再加上Java语言本身提供的像素操作实在是让我觉得不爽,所以想在Java中使用OpenCV。(备注:开发工具是Eclipse)
主要的参考资料为:
1 http://blog.csdn.net/haoba1987/article/details/8175390
2 http://code.google.com/p/javacv/
步骤总结如下:
1 在OpenCV官网上下载OpenCV-2.4.4,在http://code.google.com/p/javacv/downloads/list里下载javacv-0.4-cppjars.zip,这里注意匹配问题,Javacv0.4可以支持OpenCV-2.4.4
2 安装OpenCV2.4.4,注意安装的路径中不要出现中文;添加系统环境变量PATH:
D:\OpenCV-2.4.4\opencv\build\x86\vc9\bin;
参考博客中使用的是OpenCV2.4.2,添加的还有什么tbb环境变量,在OpenCV2.4.4中压根就没有common文件夹,所以这一项可以忽略。
3 安装完成之后,可以在Visual Studio中测试OpenCV2.4.4是否好用;在这里注意项目包含文件和库文件的添加:(由于我的操作系统不是Win7的正式发布版,所以无法安装VS2010等以上版本,所以依旧在VS2008中进行测试)
工具->选项->项目和解决方案->VC++目录
包含文件:D:\OpenCV-2.4.4\opencv\build\include
D:\OpenCV-2.4.4\opencv\build\include\opencv
D:\OpenCV-2.4.4\opencv\build\include\opencv2
库文件: D:\OpenCV-2.4.4\opencv\build\x86\vc9\lib
4 OpenCV2.4.4测试成功安装完成之后,进入到Eclipse,新建Java Project,并在该工程目录下新建文件夹lib和libs\armeabi(这里我也不太清楚是为什么,按照参考博文来的,暂时好用就行~==!);然后把下载的javacv-0.4-cppjars.zip解压,解压后的文件全部拷贝到libs文件夹下,并在Java工程目录下进行刷新,此步截图如下:
㈡ 用OpenCV开发人脸识别软件,用Java好还是用C/C++好
我去年就用opencv开发的android手机端的关于人脸识别的增强现实应用。我可以很明确的告诉你,java的opencv顶多调用摄像头用,图像处理都用c++的opencv。对于opencv的开发,不管从开发效率还是执行效率,绝对是c++。java版的opencv想都不要想。
㈢ javacv跟opencv有什么区别
javacv的功能远远大于opencv,opencv只能用于处理图像,而javacv不仅包含opencv全套api,还支持ffmpeg音视频编解码,tensflow、caffe等深度学习库,tessrac ocr等字符识别,矩阵计算库。
这样讲好了,opencv只是javacv中的一个小模块
㈣ java opencv和javacv的区别
javaCV之所以叫javaCV就是因为openCV而得名,所以javaCV在图像处理上的能力等同于openCV,但在视频处理上要比openCV好,因为javaCV内置了7个视觉库,ffmpeg和opencv只是其中两个,而我们常用的也就是这两个库,另外5个库暂时用不到。
㈤ opencv中的Dnn模块怎么用Java调用
1.检查环境变量设定。
比如:所编辑的Dll在目录“D:/cppProjects/nativecode/release”内,将这个路径复制添加到电脑的环境变量中的path变量内即可。
2.检查项目属性设定。
右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面“D:/cppProjects/nativecode/release”路径。(当然如果将dll拷贝到workspace下也可以用相对路径。也可右击“src”设定其properties内Native Library项。)
㈥ 如何把opencv的函数封装到java
cvCvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
函数原型:void cvCvtColor( const CvArr* src, CvArr* dst, int code );
参数:
src 输入的 8-bit,16-bit或 32-bit单倍精度浮点数影像。
dst 输出的8-bit, 16-bit或 32-bit单倍精度浮点数影像。
code
色彩空间转换的模式,该code来实现不同类型的颜色空间转换。比如CV_BGR2GRAY表示转换为灰度图,CV_BGR2HSV将图片从RGB空间转换为HSV空间。其中当code选用CV_BGR2GRAY时,dst需要是单通道图片。当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。
例子:
IplImage*src=cvLoadImage("4085_1.jpg",1);//原图
IplImage*dst_gray=cvCreateImage(cvGetSize(src),src->depth,1);//灰度图
IplImage*dst_image=cvCreateImage(cvGetSize(src),32,src->nChannels);
IplImage*src_image_32=cvCreateImage(cvGetSize(src),32,src->nChannels);
//这两个图需要是32浮点位的,因为对原图进行<ahref="https://www..com/s?wd=%E5%BD%92%E4%B8%80%E5%8C%96&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-"target="_blank"class="-highlight">归一化</a>后得到的是<ahref="https://www..com/s?wd=%E6%B5%AE%E7%82%B9%E6%95%B0&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-"target="_blank"class="-highlight">浮点数</a>
cvCvtColor(src,dst_gray,CV_BGR2GRAY);//得到灰度图
cvConvertScale(src,src_image_32,1.0/255.0,0);//将原图RGB<ahref="https://www..com/s?wd=%E5%BD%92%E4%B8%80%E5%8C%96&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-"target="_blank"class="-highlight">归一化</a>到0-1之间
cvCvtColor(src_image_32,dst_image,CV_BGR2HSV);//得到HSV图
㈦ javacv和opencv的依赖之间相互冲突吗
高版本的JavaCV是可以调用低版本的openCV的
可见它是依赖javaCV库的,库文件就是在lib文件夹下的那些个.jar文件,如javacv.jar,只要在javac编译JavacvTest.java时-classpath加入lib的path即可。但是后来发现这个版本的javaCV调用的是openCV-2.2.0版本,高版本的openCV它肯定是不支持的,而我在ubuntu下安装openCV-2.2.0中间总是报错,没有安装成功。所以我后来安装了openCV-2.4.1版本,并且去javaCV的网站下载了最新版本的JavaCV,高版本的JavaCV是可以调用低版本的openCV的,反之不可(这一段走了很多弯路,纠结~)。注意javaCV要去googlecode下,最新的javaCV已经迁移到github上了,但是它的package信息和类名已经变了,如由com.googlecode.javacv.cpp.opencv_core.*变成了org.bytedeco.javacpp.opencv_core.*
㈧ java opencv 怎样确定sift 匹配结果
这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋。也是醉了!!!!实在看不下去,来点干货。我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操作。但实际用起来的时候还不是那么简单。下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍。
OPENCV下SIFT特征点提取与匹配的大致流程如下:
读取图片-》特征点检测(位置,角度,层)-》特征点描述的提取(16*8维的特征向量)-》匹配-》显示
其中,特征点提取主要有两个步骤,见上行黄子部分。下面做具体分析。
1、使用opencv内置的库读取两幅图片
2、生成一个SiftFeatureDetector的对象,这个对象顾名思义就是SIFT特征的探测器,用它来探测衣服图片中SIFT点的特征,存到一个KeyPoint类型的vector中。这里有必要说keypoint的数据结构,涉及内容较多,具体分析查看opencv中keypoint数据结构分析,里面讲的自认为讲的还算详细(表打我……)。简而言之最重要的一点在于:
keypoint只是保存了opencv的sift库检测到的特征点的一些基本信息,但sift所提取出来的特征向量其实不是在这个里面,特征向量通过SiftDescriptorExtractor 提取,结果放在一个Mat的数据结构中。这个数据结构才真正保存了该特征点所对应的特征向量。具体见后文对SiftDescriptorExtractor 所生成的对象的详解。
就因为这点没有理解明白耽误了一上午的时间。哭死!
3、对图像所有KEYPOINT提取其特征向量:
得到keypoint只是达到了关键点的位置,方向等信息,并无该特征点的特征向量,要想提取得到特征向量就还要进行SiftDescriptorExtractor 的工作,建立了SiftDescriptorExtractor 对象后,通过该对象,对之前SIFT产生的特征点进行遍历,找到该特征点所对应的128维特征向量。具体方法参见opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作简单分析。通过这一步后,所有keypoint关键点的特征向量被保存到了一个MAT的数据结构中,作为特征。
4、对两幅图的特征向量进行匹配,得到匹配值。
两幅图片的特征向量被提取出来后,我们就可以使用BruteForceMatcher对象对两幅图片的descriptor进行匹配,得到匹配的结果到matches中,这其中具体的匹配方法暂没细看,过段时间补上。
至此,SIFT从特征点的探测到最后的匹配都已经完成,虽然匹配部分不甚了解,只扫对于如何使用OPENCV进行sift特征的提取有了一定的理解。接下来可以开始进行下一步的工作了。
附:使用OPENCV下SIFT库做图像匹配的例程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// opencv_empty_proj.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include opencv.hpp>
#include features2d/features2d.hpp>
#includenonfree/nonfree.hpp>
#includelegacy/legacy.hpp>
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//从文件中读入图像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//显示图像
imshow("image before", img);
imshow("image2 before",img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vectorkp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<angle<<"\t"<class_id<<"\t"<octave<<"\t"<pt<<"\t"<response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2> matcher;
vector matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
㈨ android如何在 java opencv 中查找最大轮廓
我们都知道要学opencv必须会C或者C++语言,但是opencv为了照顾我们这些java程序员,整出来了个java-opencv预编译
包。说白了,包里面就是一个个用java写的opencv代码,这样我们就可以通过类和对象的方式去调用这个opencv包里面的方法了。
这个包和我们普通的java工程一样。如图:
我们只要把这个工程导入到和我们项目工程的同一个目录下,然后做以下操作就可以调用opencv库函数了。对你的工程点击右键选择Properties。
然后点击Add按钮,将OpenCV-2.3.1这个工程添加到Is Library里面就ok了。记住:OpenCV-2.3.1这个工程必须和你的工程在同一个工作空间。这样你就可以在java中使用openCV做图像处理了