Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用cornerHarris知道拐角的编号_C++_Opencv - Fatal编程技术网

C++ 使用cornerHarris知道拐角的编号

C++ 使用cornerHarris知道拐角的编号,c++,opencv,C++,Opencv,如何知道cornerHarris计算的角数?我编写的函数如下: ... Mat gray; cvtColor( img, gray, CV_BGR2GRAY ); int thresh = 160; Mat dst, dst_norm, dst_norm_scaled; dst = Mat::zeros( img.size(), CV_32FC1 ); // Detector parameters int blockSize =

如何知道cornerHarris计算的角数?我编写的函数如下:

    ...
    Mat gray;
    cvtColor( img, gray, CV_BGR2GRAY );
    int thresh = 160;
    Mat dst, dst_norm, dst_norm_scaled;
    dst = Mat::zeros( img.size(), CV_32FC1 );

    // Detector parameters
    int blockSize = 2;
    int apertureSize = 3;
    double k = 0.04;

    // Detecting corners
    cornerHarris( gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );

    // Normalizing
    normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
    convertScaleAbs( dst_norm, dst_norm_scaled );

cornerHarris
不计算特定数量的拐角。它将创建一个新图像
dst
,该图像的大小与原始图像
的灰度值相同。您可以定义一个阈值,从该值中可以找到角点。如果将阈值定义为更小,您将拥有更多的角点。
在本例中,您可以找到预定义值
thresh
的角点,如下所示:

for( int j = 0; j < dst_norm.rows ; j++ ){ 
    for( int i = 0; i < dst_norm.cols; i++ ){
        if( (int) dst_norm.at<float>(j,i) > thresh ){
                /* Whatever your would like to do with that corner */
        }
    }
}
for(int j=0;j阈值){
/*不管你想对那个角落做什么*/
}
}
}

有关更多信息,请参阅此部分。

如果使用计数器增加循环中的值,则返回给我的值正好两次。为什么?如果我写:
for(int j=0;jthresh){count+=1;}
精化后,count的值是两次。如果您所说的两次是指
count==2
,则表示它在给定的
阈值内找到了两个角点。如果您的期望值高于此值,则可能需要降低
thresh
。可能我无法解释。如果除了增加计数器外,在点I周围设计一个圆,得到n个圆,计数器为2*n,打印
I
j
的值,看看每个圆是否有两个非常接近的值。可能它实际上画了两个非常接近的圆。所以你得到了两个非常接近的角,实际上只有一个。