2012-11-24 4 views
3

허용되는 유형과 함께 사용하는 매트 유형의 경우 일부 할당을 시도하거나 스트리밍 등을 시도 할 때 아래와 같은 오류가 발생합니다. MSVC++ 2010 익스프레스 컴파일러에서 발생합니다 gnu g ++ 컴파일러에서는 발생하지 않습니다.cv :: Mat 데이터에 액세스하기위한 OpenCV 오류

예 결함 사용 :

Mat M = Mat::zeros(image.size(), DataType<int>::type ); 

std::cout << M.at<int>(0,0) << std::endl; // error 

// OR 

int x = M.at<int>(0,0); // error 

두 개의 오류가 함께 해고 :

Unhandled exception at <some hex adress> in test.exe:Microsoft C++ exception: cv:xception at memory location <some hex adress> 

및 콘솔 창

OpenCV Error: Assertion failed ... \mat.hpp, line 537 

어떤 제안에 팝업 창에서?

답변

6

매트릭스 데이터 유형을 CV_16U으로 설정하십시오.

.at 접근 자 기능은 매우 세밀하며 매우 정확한 데이터 유형이 필요합니다. 일부 컴파일러는 이러한 문제를 무시하고 다른 컴파일러는이를 조기에 발견합니다.

matrix.at<int>(row, col)으로 요소를 참조하는 대신 CV_16Uunsigned short 데이터 형식을 참조합니다. 따라서 요소는 matrix.at<unsigned short>(row, col)으로 액세스 할 수 있습니다.

+0

다음 작업을 수행했지만 작동하지 않습니다 ... Mat M = Mat :: zeros (image.size(), CV_16S); std :: cout << M.at (0,0) << std :: endl; – Zoran

+1

맞아요.하지만 물건을 short 대신 int로 호출하고 있습니다. 컴파일러에 따라 완벽하게 해결 될 수도 있고 그렇지 않을 수도 있습니다. 매트릭스 참조에 암시 적 캐스트가 있다고 가정하지 마십시오 – Chris

+0

고맙습니다. 명시 적 형변환이 핵심입니다. 나는 내 문제를 완전히 해결하지 못했다. 매트의 값을 매트에 지정하려면 어떻게해야합니까? M1.at (0,0) = M2.at (i, j) 모두 CV_32F이거나 M2가 CV_32S라고 가정합니다. – Zoran

0

openCV에 int 데이터 유형 이미지가 있다고 생각하지 않습니다.
정수형은 일반적으로 CV_16s 즉 16 비트 단락이므로 사용

+0

v.2.4.x에서 알 수 있듯이 캐스팅을 올바르게 처리해야합니다. – Zoran

관련 문제