導航:首頁 > 編程語言 > opencv3java

opencv3java

發布時間:2022-08-18 15:03:27

⑴ 在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文件中對這些方法進行顯示聲明。

閱讀全文

與opencv3java相關的資料

熱點內容
雲點播電影網php源碼 瀏覽:93
pythonclass使用方法 瀏覽:222
移動加密軟體去哪下載 瀏覽:281
php彈出alert 瀏覽:207
吉林文檔課件加密費用 瀏覽:131
感測器pdf下載 瀏覽:284
隨車拍app綁定什麼設備 瀏覽:898
方維團購系統源碼 瀏覽:991
linux反彈shell 瀏覽:159
列印機介面加密狗還能用嗎 瀏覽:301
二板股票源碼 瀏覽:448
度人經pdf 瀏覽:902
怎麼配置android遠程伺服器地址 瀏覽:960
java程序員看哪些書 瀏覽:943
什麼app可以免費和外國人聊天 瀏覽:797
pdf手寫筆 瀏覽:182
別永遠傷在童年pdf 瀏覽:990
愛上北斗星男友在哪個app上看 瀏覽:421
主力散戶派發源碼 瀏覽:671
linux如何修復伺服器時間 瀏覽:61