2016-07-07 9 views
0

매트 이미지를 선언하고 값을 할당합니다.단일 채널 OpenCV Mat.at <>가 잘못된 값을 내림

Mat magnitude = Mat(gradient_columns.cols, gradient_columns.rows, CV_64FC1); 
for(int i = 0; i < gradient_columns.cols; i++) 
{ 
    for(int j = 0; j < gradient_columns.rows; j++) 
    { 
     magnitude.at<double>(Point(i,j)) = (double)hypot(gradient_columns.at<double>(Point(i,j)), gradient_rows.at<double>(Point(i,j))); 
    } 
} 

상기 매트 인쇄 :

cout << "M = " << magnitude << endl; 

결과 :

M = [0, 0, 0.1257399049164523, 12.36316814720732, 12.50461780753356, 0.2674320707434279, 10.39230484541326, 12.03299037437945, 5.430256687374658, 
12.03299037437945, 4.684492386402418, 4.72934192083521, 12.16431633381293, 5.397674732957373, 12.30042244512288, 10.25834261322606, 0.3944487245360109, 
12.16431633381293, 11.84297951775486, 12.44187210544911, 12.10132213098092, 
0.4088817310696626, 10.15078660267586, 12.09573607646389, 2.076275433221507, 0, 0.1257399049164523, 0, 0.1257399049164523, 0; 
..... 
.....] 

상기 결과는 완전히 정확한 예상대로. 내가 개별 값을 인쇄하려고하면

그러나 내가 잘못 결과를 얻을 :

cout.precision(20); 
cout << "CHANNELS: " << magnitude.channels() << endl; 
cout << magnitude.at<double>(Point(0, 2)) << endl; 
cout << magnitude.at<double>(Point(0, 3)) << endl; 
cout << magnitude.at<double>(Point(0, 4)) << endl; 
cout << magnitude.at<double>(Point(0, 5)) << endl; 

Result | Actual Value: 
CHANNELS: 1 
0.062870 | 0.1257399049164523, 
0.000000 | 12.36316814720732, 
0.031404 | 12.50461780753356, 
0.000000 | 0.2674320707434279 

나는 그것의 일부 데이터 유형 변환 문제를 이해하지만, 만약 사람이 어떤 솔루션을 제안 할 수 있습니다?

감사합니다.

+0

'Mat.at (Point (i, j))'대신에'Mat.at (j, i)' – Sunreef

+0

을 쓰는 것이 더 명확합니다. 성능 향상을 위해 두 루프를 교환해야합니다 (바깥 쪽 루프의 행을 반복합니다). – Micka

답변

0

나는 매트릭스에 아무런 문제가 없다고 생각합니다. 당신은 자신이 생각하는 것을 인쇄하지 않고 있습니다.

magnitude.at<double>(Point(0,2))으로 작성하면 0과 2 열의 번호는 2 열과 0 열의 숫자로 인쇄되지 않습니다. 대신 magnitude.at<double>(0,2)으로 작성하십시오.

+0

그게 전부입니다. 지금은 이해합니다! 감사! –