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不是零)
可視化
有沒有出路?或者這些結果可以嗎? PS抱歉我寫錯了。英語不是我的母語。
您是否嘗試過你的函數步進使用調試,看看是什麼問題? – nijansen
@nijansen是的,我願意。我發現這個值(int)cv :: fastAtan2(y_edge.at(i,j),x_edge.at (i,j))每次小於或等於90 –