我是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);
}
}
}
答案 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;
你的代码中的 i
,j
将是i,j计数器的值。
我需要放置哈里斯角点的坐标