2011-12-26 153 views
6

我正在嘗試將一些遺留代碼從iPhone遷移到Android。此代碼使用OpenCV庫進行一些圖像處理。總體進展順利,但我被困在一個代碼行我不知道如何可以轉換成Java代碼:將OpenCV代碼從C++轉換爲Java

Scalar dMean; 
Scalar scalar; 
std::vector<Mat> channels; 
split(mat, channels); 
for(int i=0; i<3; ++i) { 
    channels[i] += dMean[i]; 
} 

的問題是 - 應該用什麼來代替Java中的+ =運算符將一個Scalar對象添加到Mat的代碼?

+0

你能告訴我們你有什麼,在哪裏(在Java中)你卡住了嗎? – MByD 2011-12-26 14:00:27

+0

+ =是基元的可接受運算符,但不適用於對象。您可能必須編寫一個方法來爲對象添加附加內容。 – Kylar 2011-12-26 14:01:57

+0

C++代碼將一個標量添加到Mat對象。在Java中,我創建了Scalar和Mat對象,但找不到將Scalar添加到Mat的方法。JavaCV中的Core類包含一個靜態metod add(Mat,Mat,Mat),但它只允許添加兩個Mat's – Anton 2011-12-26 14:05:32

回答

5

注:藉此答案與鹽糧,我還沒有完全測試此;)

OPTION1:

最直接的辦法,如果你只打算處理幾個像素,通過使用your_mat.put(行,列,數據)your_mat.get(行,列)

因爲put()方法不接受Scalar對象作爲數據參數,您必須將Scalar轉換的東西,put()接受。如果你的Scalar是(1,2,3)也許是一個int數組int []標量= {1,2,3};如果你的Scalar是(1,2,3)也許是一個int數組。應該做的伎倆。

int[] scalar = ... // convert from Scalar object 

// assuming the result of get() is an int[], sum both arrays: 
int[] data = your_mat.get(row, col) + scalar // <- pseudo-code alert :D 

your_mat.put(row, col, data); 

OPTION2:

,但是推薦的方式,進行了大量的像素處理的,是首先Mat轉換成Java原始,工藝原始,然後將其轉換回Mat。這是爲了避免太多的JNI調用,這種方法會執行2個JNI調用,而前者每個put/get調用一個。

對應的Java基本數組類型取決於墊類型:

CV_8U and CV_8S -> byte[]; 
CV_16U and CV_16S -> short[]; 
CV_32S -> int[]; 
CV_32F -> float[]; 
CV_64F-> double[]; 

因此,代碼將是這樣的:

// assuming Mat it's of CV_32S type 
int buff[] = new int[your_mat.total() * your_mat.channels()]; 

your_mat.get(0, 0, buff); 

// buff is now Mat converted to int[] 

your_mat.put(0, 0, buff); // after processing buff, convert it back to Mat type 

OPTION 3:

確定,所以這些解決方案相當醜陋,這種方法並不是最有效的方法,但它不像Java那樣難看:

List<Integer> scalarList = ... // your conversion from a Scalar to a List 
List<Integer> channelsList = new ArrayList<Integer>(); 

Converters.Mat_to_vector_int(channels, channelsList); // this is an existing OpenCV4Android converter 

// process channelsList and scalarList, store in channelsList 

channels = Converters.vector_int_to_Mat(channelsList); // after processing, convert it back to Mat type 

現在,我想它選項3頗爲相似選項2,如果OpenCV的的公司內部,選項2轉換類似Converters工作。

+0

雖然這個答案不再相關,但我會接受它,因爲它似乎是正確和完整的 – Anton 2012-06-06 13:14:10

+1

是的,我後來發現問題有點老了。但是,對於新的opencv用戶來說,這個問題現在仍然很常見。 AFAIK這些選項是目前迭代Java中像素的最佳選擇。 – 2012-06-07 18:47:59