「java加载opencv」java加载顺序
今天给各位分享java加载opencv的知识,其中也会对java加载顺序进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java可以用opencv的哪些功能
- 2、opencv中的Dnn模块怎么用Java调用
- 3、在java环境下编写opencv,用哪款java软件比较好
- 4、怎样在eclipse中加载opencv for android
- 5、如何把opencv的函数封装到java
- 6、java servlet调用opencv的问题
java可以用opencv的哪些功能
整个项目的结构图:
编写DetectFaceDemo.java,代码如下:
[java] view
plaincopyprint?
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);
}
}
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
plaincopyprint?
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
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
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项。)
在java环境下编写opencv,用哪款java软件比较好
本来是要写一个简单的Base64编码程序,把一个图像文件利用Base64编码转换成一个txt文档;由于之前一直用C++做图像处理,所以对OpenCV各种恋恋不舍,再加上Java语言本身提供的像素操作实在是让我觉得不爽,所以想在Java中使用OpenCV。(备注:开发工具是Eclipse)
主要的参考资料为:
1
2
步骤总结如下:
1 在OpenCV官网上下载OpenCV-2.4.4,在里下载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工程目录下进行刷新,此步截图如下:
怎样在eclipse中加载opencv for android
在Android中使用Opencv
使用opencv有两种方式,一种是使用opencv的java版本的API,但是这种方式不是通过本地调用实现的,全部都是java代码,所以这里先不讲,另外一种方式就是使用opencv的c++版本的API,将本地c++代码编译成.so链接库,然后在安卓开发中进行调用,本地cpp代码使用NDK进行编译。
5.1
安卓代码
下面给出一个使用Canny算子检测边缘的本地代码调用的使用方式。
新建安卓项目,配置使用安卓API等信息,这里我的项目名称为HaveImgFun
然后修改界面控制文件res-layout-activity_have_img_fun.xml
?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android=""
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
Button android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/btnNDK"
android:text="使用C++ OpenCV进行处理" /
Button android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/btnRestore"
android:text="还原" /
ImageView android:id="@+id/ImageView01"
android:layout_width="fill_parent"
android:layout_height="fill_parent" /
/LinearLayout
在文件夹src下的com.testopencv.haveimgfun包中新建一个类用于包装使用了opencv
c++代码的动态库的导出函数,类名为LibImgFun。
Eclipse会为你创建一个新的文件LibImgFun.java,将里面的内容改为:
package com.testopencv.haveimgfun;
public class LibImgFun {
static {
System.loadLibrary("ImgFun");
}
/**
* @param width the current view width
* @param height the current view height
*/
public static native int[] ImgFun(int[] buf, int w, int h);
}
从上面的代码可以得知,我们的动态库名字应该为“libImgFun.so”,注意"public
static native int[] ImgFun(int[] buf, int w, int h)"中的native关键字,表明这个函数来自native
code。static表示这是一个静态函数,这样就可以直接用类名去调用。
修改功能代码,修改HaveImgFun.java的代码,代码内容如下:
package com.testopencv.haveimgfun;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.widget.ImageView;
public class HaveImgFun extends Activity {
/** Called when the activity is first created. */
ImageView imgView;
Button btnNDK, btnRestore;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_have_img_fun);
this.setTitle("使用NDK转换灰度图");
btnRestore = (Button) this.findViewById(R.id.btnRestore);
btnRestore.setOnClickListener(new ClickEvent());
btnNDK = (Button) this.findViewById(R.id.btnNDK);
btnNDK.setOnClickListener(new ClickEvent());
imgView = (ImageView) this.findViewById(R.id.ImageView01);
Bitmap img = ((BitmapDrawable) getResources().getDrawable(
R.drawable.lena)).getBitmap();
imgView.setImageBitmap(img);
}
class ClickEvent implements View.OnClickListener {
public void onClick(View v) {
if (v == btnNDK) {
long current = System.currentTimeMillis();
Bitmap img1 = ((BitmapDrawable) getResources().getDrawable(
R.drawable.lena)).getBitmap();
int w = img1.getWidth(), h = img1.getHeight();
int[] pix = new int[w * h];
img1.getPixels(pix, 0, w, 0, 0, w, h);
int[] resultInt = LibImgFun.ImgFun(pix, w, h);
Bitmap resultImg = Bitmap.createBitmap(w, h, Config.RGB_565);
resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
long performance = System.currentTimeMillis() - current;
imgView.setImageBitmap(resultImg);
HaveImgFun.this.setTitle("w:" + String.valueOf(img1.getWidth())
+ ",h:" + String.valueOf(img1.getHeight()) + "NDK耗时"
+ String.valueOf(performance) + " 毫秒");
} else if (v == btnRestore) {
Bitmap img2 = ((BitmapDrawable) getResources().getDrawable(
R.drawable.lena)).getBitmap();
imgView.setImageBitmap(img2);
HaveImgFun.this.setTitle("使用OpenCV进行图像处理");
}
}
}
}
5.2 C++代码
在项目中新建一个jni文件,用于放置该项目的所有cpp代码。
在jni文件夹下建立一个"ImgFun.cpp"的文件,内容改为下面所示:
#include jni.h
#include stdio.h
#include stdlib.h
#include opencv2/opencv.hpp
using namespace cv;
IplImage * change4channelTo3InIplImage(IplImage * src);
extern "C" {
JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(
JNIEnv* env, jobject obj, jintArray buf, int w, int h);
JNIEXPORT jintArray JNICALL Java_com_testopencv_haveimgfun_LibImgFun_ImgFun(
JNIEnv* env, jobject obj, jintArray buf, int w, int h) {
jint *cbuf;
cbuf = env-GetIntArrayElements(buf, false);
if (cbuf == NULL) {
return 0;
}
Mat myimg(h, w, CV_8UC4, (unsigned char*) cbuf);
IplImage image=IplImage(myimg);
IplImage* image3channel = change4channelTo3InIplImage(image);
IplImage* pCannyImage=cvCreateImage(cvGetSize(image3channel),IPL_DEPTH_8U,1);
cvCanny(image3channel,pCannyImage,50,150,3);
int* outImage=new int[w*h];
for(int i=0;iw*h;i++)
{
outImage[i]=(int)pCannyImage-imageData[i];
}
int size = w * h;
jintArray result = env-NewIntArray(size);
env-SetIntArrayRegion(result, 0, size, outImage);
env-ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}
}
IplImage * change4channelTo3InIplImage(IplImage * src) {
if (src-nChannels != 4) {
return NULL;
}
IplImage * destImg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
for (int row = 0; row src-height; row++) {
for (int col = 0; col src-width; col++) {
CvScalar s = cvGet2D(src, row, col);
cvSet2D(destImg, row, col, s);
}
}
return destImg;
}
在上面的代码中,给出了简单的Canny算子检测边缘的代码,并且返回检测后的图像显示。
上面的代码中#include
jni.h是必须要包含的头文件,#include
opencv2/opencv.hpp是opencv要包含的头文件。
5.3
配置文件
然后再在jni下新建两个文件"Android.mk"文件和"Application.mk"文件,这两个文件事实上就是简单的Makefile文件。
使用NDK进行编译的时候,需要使用Android.mk和Application.mk两个文件。
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
include E:\java\OpenCV-2.4.5-android-sdk\sdk\native\jni\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:=armeabi armeabi-v7a
在Android.mk文件中,需要主要修改的代码是如下一行: include E:\java\OpenCV-2.4.5-android-sdk\sdk\native\jni\OpenCV.mk
这里需要将Android
SDK中的OpenCV.mk文件包含进来,可以使用相对路径或者绝对路径。但是最好不要将Android
SDK放在和工作空间不在一个磁盘分区的地方,这样很容易出错。
然后需要使用LOCAL_SRC_FILES包含需要编译的文件。
5.4
编译本地C++代码
编译本地C++代码可以使用Cygwin进行编译,cd
到项目目录,然后运行ndk-build
也可以使用windows控制台进行编译,同样cd到项目目录,运行ndk-build
还可以使用Eclipse进行编译,建议配置使用Eclipse进行编译,这样当项目的本地cpp代码发生变化的时候就可以实现自动的cpp代码编译,不用每次都在命令行中手动的进行编译,虽然使用黑乎乎的命令行手动编译,输出一堆信息显着很牛逼的样子。
(一下内容,如果使用cygwin进行编译,则不需要进行操作,直接使用cygwin或者命令行进行编译,保证编译通过以后即可运行程序,如果选择使用Eclipse自动进行编译,则参考一下内容进行配置)
首先需要将该项目转换到C++项目,使得该项目具有C++代码属性,如下所述。
点击项目,右击,
New
- Other - C/C++ - Convert to a C/C++ Project .
配置Eclipse对cpp代码进行编译:
首先需要给当前项目添加一个编译环境变量
如下目录
open
Eclipse menu Window - Preferences - C/C++ - Build
- Environment ,
点击
Add...
添加一个NDKROOT,并且设置值为Android
SDK的根目录。
然后设置编译的一些参数
Project
Properties - C/C++ Build , uncheck Use
default build command ,
replace “Build command” text from "make"
to
"${NDKROOT}/ndk-build.cmd"
on Windows,
"${NDKROOT}/ndk-build"
on Linux and MacOS.
如何把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浮点位的,因为对原图进行a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBnhcdmhDzmHb3rjTLnvcs0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWDkPH6znWbLrHcdn1b4P1bYPs" target="_blank" class="baidu-highlight"归一化/a后得到的是a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBnhcdmhDzmHb3rjTLnvcs0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWDkPH6znWbLrHcdn1b4P1bYPs" target="_blank" class="baidu-highlight"浮点数/a
cvCvtColor(src,dst_gray,CV_BGR2GRAY);//得到灰度图
cvConvertScale(src,src_image_32,1.0/255.0,0);//将原图RGBa href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dBnhcdmhDzmHb3rjTLnvcs0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnWDkPH6znWbLrHcdn1b4P1bYPs" target="_blank" class="baidu-highlight"归一化/a到0-1之间
cvCvtColor(src_image_32,dst_image,CV_BGR2HSV);//得到HSV图
java servlet调用opencv的问题
1、引入opencv的jar包
2、把dll配置到path里面的native library,我的64位系统,引入x64的dll。
2、将opencv中build/java里的dll放到tomcat的bin里面,然后就OK了
关于java加载opencv和java加载顺序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。