「java加载opencv」java加载顺序

博主:adminadmin 2023-03-19 05:27:10 471

今天给各位分享java加载opencv的知识,其中也会对java加载顺序进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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加载顺序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。