⑴ 在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工程目录下进行刷新,此步截图如下:
⑵ javacv跟opencv有什么区别
JavaCV是7个图形库的封装,可以调用OpenCV。
OpenCV是1个独立的图形库,从第3版开始,底层是C++写的,以面向对象的方式封装。提供Java、Python的接口。OpenCV有Java接口,不需要另外下载JavaCV。但JavaCV是7个库的接口,功能更多。
⑶ 如何在android中使用OpenCV
如何在Android程序中使用OpenCV
有两种方式(重点讲后面一种):
1.使用OpenCV Java API。
OpenCV安装路径"F:OpenCV-2.3.1-android-bin"下有两个文件夹,
将文件夹"OpenCV-2.3.1"拷贝到你的Eclipse工作空间所在的目录,也就是在你的项目的上一级目录中,然后导入到工作空间中,在Package Explorer中选择你的项目,单机右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV-2.3.1并点击OK,
此时,展开你的项目树,你可以看到新加了一个OpenCV-2.3.1_src目录,如下图,那么就是正确添加了OpenCV Java API,否则就是你放置OpenCV-2.3.1的目录路径不正确。
然后就可以在你的Java源文件中导入OpenCV的API包,并且使用OpenCV API了,OpenCV API的包的形式如下:
Org.opencv.(OpenCV模块名).(OpenCV类名)
例如:
Org.opencv.core.Mat
2.利用JNI编写C++ OpenCV代码,通过Android NDK创建动态库(.so)
新建一个工作空间,例如"TestOpenCV",在Window->Preferences中设置好Android SDK的路径。
然后新建一个Android项目,Build Target选择Android2.2,命名为"HaveImgFun",活动名改为HaveImgFun,Package name中填写com.testopencv.haveimgfun,最后点击finish。
如同使用OpenCV Java API那样,将OpenCV-2.3.1文件夹拷贝到与工作空间同一级目录中;另外,将"F:OpenCV-2.3.1-android-binsamples"下的includeOpenCV.mk文件拷贝到和项目HaveImgFun同一级目录中:
(上面这个各个文件夹和文件的放置很重要,因为OpenCV-2.3.1下的OpenCV.mk中有很多相对路径的指定,如果不是这样放置,在NDK生成动态库时可能会报文件或文件夹无法找到的错误)
选择Package Explorer中你的项目,右键选择new->folder,新建一个名为jni的文件夹,用来存放你的c/c++代码。
然后把res->layout下的main.xml的内容改为下面所示:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <Button android:layout_height="wrap_content"
8 android:layout_width="fill_parent"
9 android:id="@+id/btnNDK"
10 android:text="使用C++ OpenCV进行处理" />
11 <Button android:layout_height="wrap_content"
12 android:layout_width="fill_parent"
13 android:id="@+id/btnRestore"
14 android:text="还原" />
15 <ImageView android:id="@+id/ImageView01"
16 android:layout_width="fill_parent"
17 android:layout_height="fill_parent" />
18 </LinearLayout>
上面的代码就是一个线性布局里面包含2个按钮加上一个显示图像的ImageView
在文件夹src下的com.testopencv.haveimgfun包中新建一个类用于包装使用了opencv c++代码的动态库的导出函数,类名为LibImgFun。
Eclipse会为你创建一个新的文件LibImgFun.java,将里面的内容改为:
1 package com.testopencv.haveimgfun;
2 public class LibImgFun {
3 static {
4 System.loadLibrary("ImgFun");
5 }
6 /**
7 * @param width the current view width
8 * @param height the current view height
9 */
10 public static native int[] ImgFun(int[] buf, int w, int h);
11 }
从上面的代码可以得知,我们的动态库名字应该为“libImgFun.so”,注意"public static native int[] ImgFun(int[] buf, int w, int h)"中的native关键字,表明这个函数来自native code。static表示这是一个静态函数,这样就可以直接用类名去调用。
在jni文件夹下建立一个"ImgFun.cpp"的文件,内容改为下面所示:
1 #include <jni.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <opencv2/opencv.hpp>
5 using namespace cv;
6
7 extern "C"
8 {
9 JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h);
10 JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h){
11
12 jint *cbuf;
13 cbuf = env->GetIntArrayElements(buf, false);
14 if(cbuf == NULL)
15 {
16 return 0;
17 }
18
19 Mat myimg(h, w, CV_8UC4, (unsigned char*)cbuf);
20 for(int j=0;j<myimg.rows/2;j++)
21 {
22 myimg.row(j).setTo(Scalar(0,0,0,0));
23 }
24
25 int size=w * h;
26 jintArray result = env->NewIntArray(size);
27 env->SetIntArrayRegion(result, 0, size, cbuf);
28 env->ReleaseIntArrayElements(buf, cbuf, 0);
29 return result;
30 }
31 }
上面的代码中#include <jni.h>是必须要包含的头文件,#include <opencv2/opencv.hpp>是opencv要包含的头文件。
动态库要导出的函数如下声明:
JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(JNIEnv* env, jobject obj, jintArray buf, int w, int h);
JNIEXPORT 和JNICALL是必须要加的关键字
jintArray就是int[],这里返回类型要么为空,要么为jni中定义的类型,事实上就是CC++类型前面加上j,如果是数组,则在后面加上Array。
函数名的命名规则如下:
Java_(包路径)_(类名)_(函数名) (JNIEnv *env, jobject obj, 自己定义的参数...)
包路径中的"."用"_"(下划线)代替,类名就是上面包装该动态库函数的类的名字,最后一个才是真正的函数名;JNIEnv *env和jobject obj这两个参数时必须的,用来调用JNI环境下的一些函数;后面就是你自己定义的参数。在这里,jintArray buf代表了传进来的图像的数据,int w是图像的宽,int h是图像的高。
这个函数的功能是将传进来的图像的上半部分涂成黑色。
然后再在jni下新建两个文件"Android.mk"文件和"Application.mk"文件,这两个文件事实上就是简单的Makefile文件。
其中将Android.mk的内容改为如下所示:
LOCAL_PATH:=$(callmy-dir)
include$(CLEAR_VARS)
include../includeOpenCV.mk
ifeq("$(wildcard$(OPENCV_MK_PATH))","")
#trytoloadOpenCV.mkfromdefaultinstalllocation
include$(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
else
include$(OPENCV_MK_PATH)
endif
LOCAL_MODULE:=ImgFun
LOCAL_SRC_FILES:=ImgFun.cpp
include$(BUILD_SHARED_LIBRARY)
Application.mk的内容改为如下所示:
APP_STL:=gnustl_static
APP_CPPFLAGS:=-frtti-fexceptions
APP_ABI:=armeabiarmeabi-v7a
其中APP_ABI指定的是目标平台的CPU架构。(经过很多测试,android2.2必须指定为armeabi,android2.2以上的使用armeabi-v7a,如果没有设置对,很有可能安装到android虚拟机失败,当然你同时如上面写上也是可以的)
上面的步骤完成后,就可以使用NDK生成动态库了,打开cygwin,cd到项目目录下:
输入$NDK/ndk-build命令,开始创建动态库。
这时候刷新Eclipse的Package Explorer会出现两个新的文件夹obj和libs。
现在,只剩最后一步完成这个测试程序。
将一张图片,例如"lena.jpg"放到项目res->drawable-hdpi目录中并刷新该目录。
然后将HaveImgFun.java的内容改为下面所示:
1 package com.testopencv.haveimgfun;
2
3 import android.app.Activity;
4 import android.graphics.Bitmap;
5 import android.graphics.Bitmap.Config;
6 import android.graphics.drawable.BitmapDrawable;
7 import android.os.Bundle;
8 import android.widget.Button;
9 import android.view.View;
10 import android.widget.ImageView;
11
12 public class HaveImgFun extends Activity{
13 /** Called when the activity is first created. */
14 ImageView imgView;
15 Button btnNDK, btnRestore;
16
17 @Override
18 public void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.main);
21
22 this.setTitle("使用NDK转换灰度图");
23 btnRestore=(Button)this.findViewById(R.id.btnRestore);
24 btnRestore.setOnClickListener(new ClickEvent());
25 btnNDK=(Button)this.findViewById(R.id.btnNDK);
26 btnNDK.setOnClickListener(new ClickEvent());
27 imgView=(ImageView)this.findViewById(R.id.ImageView01);
28 Bitmap img=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
29 imgView.setImageBitmap(img);
30 }
31
32 class ClickEvent implements View.OnClickListener{
33 public void onClick(View v){
34 if(v == btnNDK){
35 long current=System.currentTimeMillis();
36 Bitmap img1=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
37 int w=img1.getWidth(),h=img1.getHeight();
38 int[] pix = new int[w * h];
39 img1.getPixels(pix, 0, w, 0, 0, w, h);
40 int[] resultInt=LibImgFun.ImgFun(pix, w, h);
41 Bitmap resultImg=Bitmap.createBitmap(w, h, Config.RGB_565);
42 resultImg.setPixels(resultInt, 0, w, 0, 0,w, h);
43 long performance=System.currentTimeMillis()-current;
44 imgView.setImageBitmap(resultImg);
45 HaveImgFun.this.setTitle("w:"+String.valueOf(img1.getWidth())+",h:"+String.valueOf(img1.getHeight())+"NDK耗时"+String.valueOf(performance)+" 毫秒");
46 } else if(v == btnRestore){
47 Bitmap img2=((BitmapDrawable) getResources().getDrawable(R.drawable.lena)).getBitmap();
48 imgView.setImageBitmap(img2);
49 HaveImgFun.this.setTitle("使用OpenCV进行图像处理");
50 }
51 }
52 }
53 }
点击全部保存,OK,现在可以选择一个Android虚拟机运行看一下效果,配置好Run Configuration然后点击Run,得到下面的结果:
⑷ opencv-249.jar和opencv_java249.dll windows64位的谁有
OpenCV3.0环境变量配置
1
选择计算机,右键属性->高级系统设置->环境变量->系统变量->找到PATH->在变量值中添加相应路径
小编的路径是逗D:\opencv3.0\opencv\build\x64\vc12\bin地注意不要在路径最后加分号,但两条路径间就得加上分号。其实这条路径就是刚刚解压OpenCV3.0的路径,其中x64指的是64位系统vc12对应VS2013
2
但这样配置,小编发现第一次并不好用,所以就将逗D:\opencv3.0\opencv\build\x86\vc12\bin地 32位的路径也加进来了,发现好使
3
所以小编在PATH后添加的完整内容为:逗;D:\opencv3.0\opencv\build\x64\vc12\bin;D:\opencv3.0\opencv\build\x86\vc12\bin 地
大家可以按照自己的路径进行设置就好^O^
END
建立一个Win32控制台项目
1
首先打开VS2013
文件->新建->项目->Visual C++新建Win32控制台项目
输入名称,比如help并选择一个位置的文件夹
2
点击下一步,在点击下一步,勾选空项目,然后点击完成
END
VS2013包含目录、库目录配置
1
现在进行目录的配置
先在源文件下建立一个.cpp源文件
取名为main.cpp
2
然后点击视图,在视图下找到其他窗口,在其他窗口下找到属性管理器,点击打开
3
然后便会有一个属性管理器的窗口了,接下来点开工程文件help,下边会有一个Debug|Win32的文件夹,点开,下有名为Microsoft.Cpp.Win32.user的文件,右键属性
4
然后选择通用属性下的VC++目录,右边会有包含目录和库目录,点击包含目录,添加以下三条路径,其实这些都是刚才OpenCV相关解压文件所在的目录
D:\opencv3.0\opencv\build\include
D:\opencv3.0\opencv\build\include\opencv
D:\opencv3.0\opencv\build\include\opencv2
这三条路径要依据自己解压OpenCV3.0的路径进行修改
5
再点击库目录添加下面一条路径,这里小编选择的是x86,之前试过用x64发现不好使,所以x86对我的机器是好使得,大家可以尝试一下。
D:\opencv3.0\opencv\build\x86\vc12\lib
END
链接库配置----添加附加依赖项
还是刚才的属性页面
点击链接器,选择输入,会在右侧看到附加依赖项,添加下面两个文件
opencv_ts300d.lib
opencv_world300d.lib
2
说明:这里小编添加的是Debug模式的,会看到文件的结尾有d,
假如要添加Release模式的,将d去掉即可
Release模式:
opencv_ts300.lib
opencv_world300.lib
⑸ 如何开发Java动态人脸识别
1.环境搭建
整个项目的结构图
2.编写DetectFaceDemo.java,代码如下:
[java] view plain
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我们将第一个字符去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
3.编写测试类:
[java] view plain
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//运行结果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
⑹ opencv3在安卓中基于Java语言识别颜色(只需要识别红色或者蓝色)的代码您知道吗或者有资料吗
和C++ CLR类似,我们使用标准的C++语言来实现同样的功能。注意到rand()这个函数是C++标准库里的内容,所以我们在文件开头增加了对stdlib.h这个头文件的引用。
这里需要注意的一点是:所有希望使用DllImport引入C#的C++方法都应该在方法声明中增加__declspec(dllexport)关键字,除非它在.def文件中对这些方法进行显示声明。