[OpenCV/java] Mat data type is not compatible: 0
프로그래밍/그 외2018. 4. 20. 00:47
안녕하세요. 개발자 드리머즈입니다.
안드로이드 스튜디오에서 OpenCV java를 이용해서
1 2 | double[] Mr = new double[mat.cols()]; mat.get(y, 0, Mr); | cs |
코드를 사용했더니
java.lang.UnsupportedOperationException: Mat data type is not compatible: 0
위의 에러가 발생했습니다. 에러가 발생한 위치를 보니..(https://www.programcreek.com/java-api-examples/index.php?source_dir=OpenCV_Java_AndroidStudio-master/opencv-java/src/main/java/org/opencv/core/Mat.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // javadoc:Mat::get(row,col,data) public int get(int row, int col, double[] data) { int t = type(); if (data == null || data.length % CvType.channels(t) != 0) throw new java.lang.UnsupportedOperationException( "Provided data element number (" + (data == null ? 0 : data.length) + ") should be multiple of the Mat channels count (" + CvType.channels(t) + ")"); if (CvType.depth(t) == CvType.CV_64F) { return nGetD(nativeObj, row, col, data.length, data); } throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t); } | cs |
위의 코드에서 13번째 줄에서 Exception을 발생시키고 있습니다. 여기 코드가 실행되려면 Mat의 CvType에 문제가 있어야 합니다.
get(int row, int col, double[] data) 함수에서 3번째 인자가 double의 배열입니다. double는 8바이트로.. 64비트입니다.
그래서 각 픽셀?의 타입이 8바이트(64비트)여야 하므로 Mat의 type이 CvType.CV_64F여야 합니다.
그런데 Mat의 type이 CvType.CV_64F가 아니라 문제가 생긴 경우였습니다.
에러가 발생한 구문을 보면.. compatible: 0라고 끝이 납니다.
여기서 마지막에 0이 의미하는 것은
1 2 3 4 5 6 7 8 | // type depth constants public static final int CV_8U = 0, CV_8S = 1, CV_16U = 2, CV_16S = 3, CV_32S = 4, CV_32F = 5, CV_64F = 6, CV_USRTYPE1 = 7; | cs |
CV_8U입니다.
따라서 문제가 되던 코드를 아래와 같이
1 2 | byte[] Mr = new byte[mat.cols()]; mat.get(y, 0, Mr); | cs |
double을 byte로 수정하니 에러가 수정됩니다!!
댓글 영역