2013-07-30 164 views
2

我想計算從深度圖的一些方向梯度的角度和基時,它(8個扇區) 但是我的功能僅計算前3個方向計算梯度方向

cv::Mat calcAngles(cv::Mat dimg)//dimg is depth map 
{ 
    const int directions_num = 8;//number of directions 
    const int degree_grade = 360; 
    int range_coeff = 255/(directions_num + 1);//just for visualize 
    cv::Mat x_edge, y_edge, full_edge, angles; 
    dimg.copyTo(x_edge); 
    dimg.copyTo(y_edge); 
    dimg.copyTo(full_edge); 
     //compute gradients 

    Sobel(dimg, x_edge, CV_8U, 1, 0, 5, 1, 19, 4); 
    Sobel(dimg, y_edge, CV_8U, 0, 1, 5, 1, 19, 4); 
    Sobel(dimg, full_edge, CV_8U, 1, 1, 5, 1, 19, 4); 

    float freq[directions_num + 1];//for collect direction's frequency 
    memset(freq, 0, sizeof(freq)); 

    angles = cv::Mat::zeros(dimg.rows, dimg.cols, CV_8U);//store directions here 
    for(int i = 0; i < angles.rows; i++) 
    { 
     for(int j = 0; j < angles.cols; j++) 
     { 
      angles.at<uchar>(i, j) = (((int)cv::fastAtan2(y_edge.at<uchar>(i, j), x_edge.at<uchar>(i, j)))/(degree_grade/directions_num) + 1 
       ) * (dimg.at<uchar>(i, j) ? 1 : 0);//fastatan returns values from 0 to 360, if i not mistaken. I want group angles by directions_num sectors. I use first 'direction' (zero value) for zero values from depth map (zero value at my depth map suggest that it is bad pixel) 
      freq[angles.at<uchar>(i, j)] += 1; 
     } 
    } 
    for(int i = 0; i < directions_num + 1; i++) 
    { 
     printf("%2.2f\t", freq[i]); 
    } 
    printf("\n"); 
    angles *= range_coeff;//for visualization 
    return angles; 
} 

停止從所述幀中的一個:

47359.00  15018.00  8199.00 6224.00 0.00 0.00 0.00 0.00 0.00 

(第一值是「零像素」,其次是在正地方梯度的數目,但只有3不是零)

可視化

enter image description here

有沒有出路?或者這些結果可以嗎? PS抱歉我寫錯了。英語不是我的母語。

+0

您是否嘗試過你的函數步進使用調試,看看是什麼問題? – nijansen

+0

@nijansen是的,我願意。我發現這個值(int)cv :: fastAtan2(y_edge.at (i,j),x_edge.at (i,j))每次小於或等於90 –

回答

4

您使用CV_8U類型爲Sobel輸出。它是無符號整數8位。所以它只能存儲正值。這就是爲什麼fastAtan2收益少於或多於90更改類型等於CV_16S和使用short類型爲訪問內容:

cv::Sobel(dimg, x_edge, CV_16S, 1, 0, 5, 1, 19, 4); 
cv::Sobel(dimg, y_edge, CV_16S, 0, 1, 5, 1, 19, 4); 

cv::fastAtan2(y_edge.at<short>(i, j), x_edge.at<short>(i, j)) 
+0

謝謝。我忘了類型 –