任何人都可以告诉我如何使用RANSAC算法在两个具有一定重叠部分的图像中选择共同的特征点吗?问题来自基于特征的图像拼接.
 

我正在实施一个Harris角点探测器用于教育目的,但我坚持使用哈里斯响应部分.基本上,我在做的是:
1和2似乎工作正常; 然而,随着哈里斯的反应,我得到的值非常小,没有任何一点达到阈值.输入是标准的户外摄影.
[...]
[Ix, Iy] = intensityGradients(img);
g = fspecial('gaussian');
Ix = imfilter(Ix, g);
Iy = imfilter(Iy, g);
H = harrisResponse(Ix, Iy);
[...]
function K = harrisResponse(Ix, Iy)
    max = 0;
    [sy, sx] = size(Ix);
    K = zeros(sy, sx);
    for i = 1:sx,
        for j = 1:sy,
            H = [Ix(j,i) * Ix(j,i), Ix(j,i) * Iy(j,i)
                Ix(j,i) * Iy(j,i), Iy(j,i) * Iy(j,i)];
            K(j,i) = det(H) / trace(H);
            if K(j,i) > max,
                max = K(j,i);
            end
        end …algorithm matlab computer-vision feature-detection corner-detection
我有一个等边三角形和一个矩形的图像:

我想只检测三角形的3个角.我按照OpenCV Harris角点检测器教程看到三角形的所有角点都有阈值= 80(当矩形阈值的所有4个角点= 255时).但我没有找到门槛和学位之间的联系.  
例如,如何找到[555]度范围内的角落?
这是输出Mat http://pastebin.com/raw.php?i=qNidEAG0  
P/s:我对CV很新,希望你能提供更多细节!
BW = poly2mask(x, y, m, n)从ROI多边形计算二进制感兴趣区域(ROI)掩模BW,由矢量x和y表示.BW的大小是m-by-n.
poly2mask将BW中的多边形(X,Y)内的像素设置为1,并将多边形外部的像素设置为0.
问题: 
鉴于BW凸四边形的这种二元掩模,确定四个角的最有效方法是什么?
例如,

最好的解决方案到目前为止: 
使用edge找到的边界线,霍夫变换,找到4行的边缘图像中,然后找到这4条线的交点,或使用一个角点检测边缘图像上.看起来很复杂,我不禁觉得那里有一个更简单的解决方案.
顺便说一句,convhull并不总是返回4分(也许有人可以提出qhull防止这种情况的选项):它也沿着边缘返回几个点.
编辑:
Amro的答案看起来非常优雅和高效.但是每个真实角落可能有多个"角落",因为峰值不是唯一的.我可以根据θ对它们进行聚类,并对真实角落周围的"角落"进行平均,但主要问题是使用order(1:10).
是否10足以说明所有的角落还是将排除"角"在真正的角落?
我尝试从一组点获得四边形的角点.
 
 

第二张照片有点极端,但我的一组点的"质量"位于第一张照片和第二张照片之间.
首先,我想要制作超过1-360°和长度的直方图,以下两点描述.四个最高峰将描述每条线的长度.但是由于iam失去了订单点,只知道度数和长度或一条线,并且不知道一条线属于哪个位置.
然后我考虑合并两个以下的行,如果它们具有或多或少相同的程度,但我不知道如何处理这里的噪音或预测角落.
有没有人知道处理这个问题或类似的算法?
作为我的学士论文的一部分,我正在尝试使用 Harris 和 Stephens 算法实现角检测器: 组合角和边缘检测器
我确实计算:
计算系统矩阵M
M = [交流; CB]
这意味着,如果我一切顺利:
现在我确实计算了 trace(M) 和我特别关心的: determinant(M)
在那里的论文中,他们建议对行列式进行以下近似,因为它避免了昂贵的特征值计算:
det(M) = A * B - C^2
这必须始终以零终止!
表达式 det(M) = A * B - C^2 可以改写为:(使用第 2 点的知识)
det(M) = A * B - C * C
det(M) = Ix*Ix …
我有一些图像,包括凸多边形和非凸多边形.每个图像只包含一个多边形.我需要检测角坐标,并需要按顺时针或逆时针顺序对它们进行排序.对于凸多边形,我使用Harris角点检测来检测角点和凸包线以对点进行排序.但我对如何排序非凸多边形没有任何想法.由于我的输入是图像,我认为一些图像处理技术可能有助于通过沿多边形边缘移动来对它们进行排序.有没有办法最简单?
示例图片:
我随机命名了角落.

预期产量:
我希望角度坐标按此顺序
 1 3 5 9 4 2 8 7 6 10或1 10 6 7 8 2 4 9 5 3.你可以从任何一点开始,不一定1
编辑1:
在对所有凸多边形以及一些非凸多边形起作用的rayryeng解之后,有一些非凸多边形与他的算法不相符.
这是一个例子

我正在尝试获取并绘制图像中的角点。现在,我有一个具有以下格式的元组列表:((row,column,scale)比例是因为我使用的是高斯金字塔),手动从 harrisCornerDetector 和 nonMaximumSupression 过程中获得。这份清单是featuresy1.
我的代码如下:
r,g,b=cv2.split(image)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
cv2.cornerSubPix( r, featuresy1, (5,5), (-1,1), criteria )
其中 image 是具有三个相同形状的灰度图像。如您所见,我将cornerSubPix这样的结构作为第二个参数提供:[(x1,y1,scale1),(x2,y2,scale2),...,(xn,yn,scalen)].
这引发了以下错误:
cv2.cornerSubPix( r, featuresy1, (5,5), (-1,1), criteria )
TypeError: corners is not a numpy array, neither a scalar
出于这个原因,我想知道应该使用什么类型、格式或结构featuresy1来cornerSubPix()工作。这是我做错的唯一一件事吗?没有太多关于此的文档。
谢谢!
cv::cornerHarris()来检测角落(我可以轻松做到)。std::vector<KeyPoint>(我不知道该怎么做)。稍后我将使用它来计算描述符并匹配它们。我可以很容易地使用 SURF 来完成它们,但我想使用 Harris 角点检测器来完成。
/// Detecting corners
cv::cornerHarris(leftRoi, dst, blockSize, apertureSize, k, BORDER_DEFAULT);
/// Normalizing
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
/// Drawing a circle around corners
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) > 165)
        {
            circle(dst_norm_scaled, Point(i, j), 5, Scalar(0), 2, 8, 0);
        }
    }
}
/// Showing the result
namedWindow("corners_window", CV_WINDOW_AUTOSIZE); …我试图在随机背景下检测广告牌图像。我能够使用SSD定位广告牌,这给了我广告牌周围的大致边界框。现在,我想为我的应用程序找到广告牌的确切角落。我尝试使用遇到的不同策略,例如哈里斯拐角检测(使用Opencv),使用Canny +形态运算+轮廓查找线的交点。输出的详细信息如下。
哈里斯拐角检测哈里斯拐角检测 的伪代码如下:
img_patch_gray = np.float32(img_patch_gray)
harris_point = cv2.cornerHarris(img_patch_gray,2,3,0.04)
img_patch[harris_point>0.01*harris_point.max()]=[255,0,0]
plt.figure(figsize=IMAGE_SIZE)
plt.imshow(img_patch)
 这里的红色点是由Harris角点检测算法检测到的角点,感兴趣的点用绿色圈出。
这里的红色点是由Harris角点检测算法检测到的角点,感兴趣的点用绿色圈出。
使用霍夫线检测 在这里,我试图找到线的交点,然后选择点。类似于stackoverflow链接,但由于广告牌中包含文本和图形,因此很难获得确切的线条。
基于轮廓的方法 在此方法中,我使用了canny边缘检测器,然后使用了dilation(3 * 3内核),然后使用了轮廓。
bin_img = cv2.Canny(gray_img_patch,100,250)
bin_img = dilate(bin_img, 3)
plt.imshow(bin_img, cmap='gray')
(_,cnts, _) = cv2.findContours(bin_img.copy(), 
cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10]
cv2.drawContours(img_patch, [cnts[0]],0, (0,255,0), 1)
 ,
,  。我曾尝试使用来自openCV的roxPolyDp函数,但它没有达到预期的效果,因为它还可以通过四点近似较大或较小的轮廓,并且在某些图像中,它可能不会在广告牌框架周围形成轮廓。
。我曾尝试使用来自openCV的roxPolyDp函数,但它没有达到预期的效果,因为它还可以通过四点近似较大或较小的轮廓,并且在某些图像中,它可能不会在广告牌框架周围形成轮廓。
我已将openCV 3.4用于所有图像处理操作。  使用的可以在这里找到。请注意,此处讨论的图像仅用于说明目的,一般而言,该图像可以是任何广告牌。在此先感谢您的帮助。
使用的可以在这里找到。请注意,此处讨论的图像仅用于说明目的,一般而言,该图像可以是任何广告牌。在此先感谢您的帮助。  
corner-detection ×10
matlab ×3
opencv ×3
algorithm ×2
polygon ×2
detect ×1
detection ×1
geometry ×1
homography ×1
keypoint ×1
math ×1
non-convex ×1
python ×1
ransac ×1
trigonometry ×1
zero ×1