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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
如何使用opencv查找模糊角点位置?_Opencv_Image Processing_Computer Vision - Fatal编程技术网

如何使用opencv查找模糊角点位置?

如何使用opencv查找模糊角点位置?,opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,我想找到一个模糊图像的角点位置,其中有一个角点。如以下示例所示: 我可以确保图像中只有一个角,我假设 角落是黑白棋盘的一部分 如何使用openCV检测交叉位置? 谢谢 通常可以使用渐变来确定角点: 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][

我想找到一个模糊图像的角点位置,其中有一个角点。如以下示例所示:

我可以确保图像中只有一个角,我假设

角落是黑白棋盘的一部分

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

通常可以使用渐变来确定角点:

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)

渐变方向:

另一种解决方案

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

#包括
使用名称空间cv;
int main()
{
Mat img=imread(“c:/data/corner.jpg”);
席灰色;
CVT颜色(img、灰色、CV_bgr2灰色);
阈值(灰色、灰色、100255、CV_阈值_二进制);
int步长=15;
std::向量点;

对于(int i=0;i而不是像其他人建议的那样立即以可笑的大范围工作,我建议先缩小尺寸(具有消除模糊的效果),进行一次Harris扫描以找到角点,然后放大其位置,并在大窗口下以全分辨率进行findCornerSubpix扫描(大到足以包围强度的明显鞍点)

通过这种方式,您可以两全其美:快速检测以初始化细化,以及精确细化原始图像


另请参见

使用阈值函数仅获取二值图像,而不是CornerHarris来查找CornerHanks buddy!我以前也尝试过这一点。实际上,使用缩尺图像查找角点的粗略位置是可以的。但是,使用findCornerSubpix来定位精确位置的结果并不好。我想我可能必须实现一个新的子对象pix查找函数。令人惊讶!findCornerSubpix的行为到底如何(在完全分辨率下,在使用粗略位置初始化后)?它会聚到某个随机的地方,或靠近一个看似合理的鞍点,但不够近吗?您是否尝试过增加迭代次数?为了澄清,您的图像确实有一个明显的鞍点,findCornerSubpix应该很容易会聚到它。查看强度在3d中绘制时的样子:很好!非常感谢。嗯。。.我不能很好地理解你的方法。你能简单地解释一下吗?再次感谢。