哈里斯角点坐标

时间:2015-12-27 21:54:54

标签: c++ opencv opencv3.0

我是opencv的新手,你能帮我找到哈里斯用以下代码检测到的点坐标吗?

源图片为img

我想在矩阵S

中存储角点的坐标
Mat S;
dst = Mat::zeros( img.size(), CV_32FC1 );
cornerHarris( img, dst, 7, 5, 0.0001, BORDER_DEFAULT );
dst = Mat::zeros( img.size(), CV_32FC1 );
cornerHarris( img, dst, 7, 5, 0.0001, BORDER_DEFAULT );

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

 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 ) {
             S.at<int >(j,i)= (int) dst_norm.at<int>(j,i);
         }
    } 
}

2 个答案:

答案 0 :(得分:0)

您可以将点坐标存储在Nx2矩阵中,其中第一列是x坐标,第二列是y坐标。

您可以将S声明为空CV_32SC1矩阵,如:

Mat S(0, 2, CV_32SC1);

(或者您甚至可以离开Mat S;,因为类型由第一个push_back确定。

然后你可以追加坐标。在if语句中,添加:

// Create a matrix for the point
Mat pt(1,2,CV_32SC1);
pt.at<int>(0, 0) = i;
pt.at<int>(0, 1) = j;

// Add the point to S
S.push_back(pt);

请注意,使用std::vector<Point>来存储点数可能更为简单。在这种情况下,您可以将Svec声明为:

std::vector<cv::Point> Svec;

并在您的if声明中,您将拥有:

Svec.push_back(Point(i,j));

Svec.emplace_back(i,j);

如果需要,您可以将vector<Point>转换为Mat,如:

Mat Z(Svec); // Creates a 2 channels matrix, Nx1
Z = Z.reshape(1); // Creates a 1 channel matrix, Nx2

答案 1 :(得分:0)

Mat pt(1,2,CV_32SC1);
pt.at<int>(0, 0) = i;
pt.at<int>(0, 1) = j;
你的代码中的

ij将是i,j计数器的值。 我需要放置哈里斯角点的坐标