[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 ? : 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로 수정하니 에러가 수정됩니다!!

작성자

Posted by 드리머즈

관련 글

댓글 영역