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;
}

フレームの 1 つから:

47359.00        15018.00        8199.00 6224.00 0.00    0.00    0.00    0.00    0.00

(最初の値は「ゼロ ピクセル」、次は n 桁のグラデーションの数ですが、ゼロではないのは 3 つだけです)

視覚化

ここに画像の説明を入力

抜け道はありますか?それとも、これらの結果は OK ですか? PS私の書き間違いで申し訳ありません。私の母国語ではない英語。

4

1 に答える 1