注:藉此答案與鹽糧,我還沒有完全測試此;)
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
工作。
你能告訴我們你有什麼,在哪裏(在Java中)你卡住了嗎? – MByD 2011-12-26 14:00:27
+ =是基元的可接受運算符,但不適用於對象。您可能必須編寫一個方法來爲對象添加附加內容。 – Kylar 2011-12-26 14:01:57
C++代碼將一個標量添加到Mat對象。在Java中,我創建了Scalar和Mat對象,但找不到將Scalar添加到Mat的方法。JavaCV中的Core類包含一個靜態metod add(Mat,Mat,Mat),但它只允許添加兩個Mat's – Anton 2011-12-26 14:05:32