如何使用opencv查找模糊角点位置?
我想找到一个模糊图像的角点位置,其中有一个角点。如以下示例所示: 我可以确保图像中只有一个角,我假设 角落是黑白棋盘的一部分 如何使用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][
谢谢 通常可以使用渐变来确定角点: 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中绘制时的样子:很好!非常感谢。嗯。。.我不能很好地理解你的方法。你能简单地解释一下吗?再次感谢。