我想找到一个模糊图像的角落位置,里面有一个角落。像下面的例子:
我可以确保图像内只有一个角,并且我假设
角落是黑白棋盘的一部分。
如何使用 openCV 检测交叉位置?谢谢!
我建议不要像其他人建议的那样立即进行大规模的工作,我建议先缩小尺寸(这具有去模糊的效果),执行一次哈里斯传球以找到角落,然后放大其位置并执行 findCornerSubpix 传球具有大窗口的全分辨率(大到足以包含强度的明显鞍点)。
通过这种方式,您可以获得两全其美:快速检测以初始化细化,并在给定原始图像的情况下进行准确细化。
另请参阅其他相关答案
另一种解决方案
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img=imread("c:/data/corner.jpg");
Mat gray;
cvtColor(img,gray,CV_BGR2GRAY);
threshold(gray,gray,100,255,CV_THRESH_BINARY);
int step=15;
std::vector<Point> points;
for(int i=0;i<gray.rows;i+=step)
for(int j=0;j<gray.cols;j+=step)
if(gray.at<uchar>(i,j)==255)
points.push_back(Point(j,i));
//fit a rotated rectangle
RotatedRect box = minAreaRect(Mat(points));
//circle(img,box.center,2,Scalar(255,0,0),-1);
//invert it,fit again and get average of centers(may not be needed if a 'good' threshold is found)
Point p1=Point(box.center.x,box.center.y);
points.clear();
gray=255-gray;
for(int i=0;i<gray.rows;i+=step)
for(int j=0;j<gray.cols;j+=step)
if(gray.at<uchar>(i,j)==255)
points.push_back(Point(j,i));
box = minAreaRect(Mat(points));
Point p2=Point(box.center.x,box.center.y);
//circle(img,p2,2,Scalar(0,255,0),-1);
circle(img,Point((p1.x+p2.x)/2,(p1.y+p2.y)/2),3,Scalar(0,0,255),-1);
imshow("img",img);
waitKey();
return 0;
}
通常您可以使用渐变来确定角点:
Gx = im[i][j+1] - im[i][j-1]; Gy = im[i+1][j] – im[i-1][j];
G^2 = Gx^2 + Gy^2;
teta = atan2 (Gy, Gx);
由于您的图像模糊,您应该以更大的比例计算梯度:
Gx = im[i][j+delta] - im[i][j-delta]; Gy = im[i+ delta][j] – im[i- delta][j];
这是我在 delta = 50 时获得的结果:
梯度范数(乘以 20)
梯度规范 http://imageshack.us/scaled/thumb/822/xdpp.jpg
渐变方向: