如何用opencv找到模糊角位置?

时间:2013-10-22 06:53:25

标签: opencv image-processing computer-vision

我想找到一个模糊图像的角落位置,里面有一个角落。如下例所示:

Blurred image example

我可以确保图像中只有一个角落,我认为

角落是黑白棋盘的一部分。

如何使用openCV检测交叉位置? 谢谢!

3 个答案:

答案 0 :(得分: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)

gradient norm http://imageshack.us/scaled/thumb/822/xdpp.jpg

渐变方向:

gradient direction http://imageshack.us/scaled/thumb/844/h6zp.jpg

答案 1 :(得分:0)

另一种解决方案

enter image description here

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

答案 2 :(得分:0)

不像其他人所建议的那样立即大规模地工作,我建议首先缩小规模(具有去模糊的效果),做一次哈里斯通过寻找角落,然后升级它的位置并做一个传球具有大窗口的全分辨率的findCornerSubpix(大到足以包含强度的明显鞍点)。

通过这种方式,您可以获得两全其美的效果:快速检测以初始化细化,并在给定原始图像的情况下进行精确细化。

另见this other relevant answer