2012-11-29 3 views
1

방금 ​​이상한 문제가 발생했습니다. 내 클래스의 헤더에서 나는 다음과 같은 여러 cv::Mat을 정의했습니다 :
img_cov = Mat::zeros(somemat.size(), CV_32FC(6))
이상한 일이 있다는 것입니다 :
코드에서 cv::Mat drawing, img_grad, img_bright, img_cov; (VER1)
cv::Mat drawing, img_grad, img_bright, img_cov, img_notused; (VER2)헤더에 cv :: Mat를 정의한 다음 다른 매트가 다중 채널을 피함

난 후 다음과 같은 img_cov 정의이 사용되지 않더라도, 내 img_cov의 다른 채널에 액세스 할 수 없다고하더라도, 내 여러 매트의 헤더 선언 (위의 ver2 참조)에 다른 매트를 추가하면 0이됩니다. img_cov.at<float>(j, i, 1)을 통해 충돌이 발생합니다.

위자료 할당 것으로 보입니다. 누군가 나에게 설명 할 수 있을까요?

답변

3

잘못된 명령을 사용하여 이미지 값에 액세스합니다 (이전에 충돌이 발생 했음에 틀림 없음). 릴리스 모드로 컴파일했을 수 있습니다.

내 라인은 다음과 같이한다 : CV_32FC(6)는 채널에 float 값 6 채널 행렬을 의미

typedef Vec<6,float> Vec6f; 
Vec6f pixel = img_cov.at<Vec6f>(i,j); 
float value_you_look_for = pixel[1]; // note that 1 means the second channel of 6. 

때문이다.

참고로

: link to specific docs

+0

감사합니다,하지만 난 내 첫 번째 게시물에 쓴 방법은 정말 잘못된 결과를 제공하지만, 왜에서 결과를 반환 않습니다 모든 내가 한 후 헤더에 다른 매트를 선언하지 주어진 액세스? 슬프게도 나는 코드 마스크에 ''을 넣지 않았기 때문에 사이트가 이런 식으로 표시하지 않았습니다. Ver2뿐만 아니라 "Ver1"에서도 가치있는 방식으로 액세스 할 수 있습니다. 그러나 이것이 위에서 언급 한 이상한 행동을 설명합니까? – moatilliatta

+0

내 길은 Ver1과 Ver2에서 제대로 작동하기 때문에 작동합니다. 너의 길은 우연히 만났어. 아마 컴파일러는 변수의 수에 따라 다른 메모리 레이아웃을 제공하며 할당 된 메모리의 한계에 더 가깝습니다. 그래도 반환 된 값은 Ver1 및 Ver2에서 잘못되어 시도하고 표시합니다. –

+0

그래, 그들은 정말로 완전히 틀리고 매우 작다. 이상하게도 어딘가에'img_cov.at (j, i, 1)'명령에 대해 적색으로 표시되었지만 분명히 그것이 잘못된 흔적이었다. 감사! – moatilliatta

관련 문제