标签: hough-transform

将坐标分裂为3个子空间以解决无界

我正在尝试实现Cascaded Hough Transform(我已经实现了'普通'版本.)但我无法理解以下内容:

在图像上应用HT后,我在霍夫空间中留下了直线.HT的级联版本要求我将霍夫空间分成3个子空间,以便解决无界值的问题.

我该怎么做呢?

这是霍夫空间如何分裂的图片: 替代文字

为了在保持对称空间对偶性的同时恢复参数空间的有界性,我们将(a,b) - 空间分成三个有界子空间,如下图所示.第一个子空间也有坐标a和b,但仅适用于| a | <= 1和| b | <= 1.如果| a | > 1和| b | <= | a | ,点(a,b)在第二个子空间中出现,坐标为1/a和b/a.如果,最后,| b | > 1和| a | <| b |,我们使用坐标为1/b和a/b的第三个子空间.

这是我感到非常困惑的地方,假设我在霍夫空间中有一条线.如果它违反了|将如何拆分 a | <= 1和| b | <= 1?

我是否只是遍历线中的所有像素,如果有问题的像素的坐标大于| a | <= 1和| b | <= 1,我在第二个子空间中绘制它?

如果在Stack Overlow上不欢迎这类问题,我深表歉意 - 是否有其他网站可以提出有关算法的问题?

图片来源和上述报价

algorithm image-processing hough-transform

9
推荐指数
1
解决办法
241
查看次数

图像中的矩形检测

我想编制一张长方形纸张的检测,这张纸在每一面都不一定要完全笔直,因为我可以"在空中"拍摄它,这意味着纸张的单面可能会得到扭曲了一下.

应用程序(iOs和android)CamScanner非常好,我想知道如何实现它.首先我想到了:

  • 平滑/降噪
  • 边缘检测(canny等)或阈值处理(全局/自适应)
  • 霍夫变换
  • 检测线(仅允许垂直/水平)
  • 计算4个找到的行的截距点

但这给了我很多不同类型图像的问题.我想知道是否有更好的方法直接检测图像中的矩形形状,如果是这样,如果camscanner也可以像这样实现它!?

以下是CamScanner中拍摄的一些图像.即使在a)侧面扭曲(但是角落仍然显示在叠加层中,但并不真正适合白纸的角落),并且在b)背景非常接近实际纸张但这些都被很好地检测到了它仍然被正确识别:

一个) b)

它甚至可以正确获取旋转的图片:

在此输入图像描述

当我插入一些测试错误时,它会失败但至少检测到一些轮廓,但总是尝试将其检测为矩形:

在此输入图像描述 在此输入图像描述

在这里它完全失败了:

在此输入图像描述

我想在最后三个例子中,如果它会进行霍夫变换,它可能已经检测到矩形的四个边中的至少两个.

有什么想法和提示吗?非常感谢提前

image image-processing rectangles edge-detection hough-transform

9
推荐指数
1
解决办法
2965
查看次数

为什么需要使用索引访问Python的OpenCV的cv2.HoughLines的返回值?

我希望我写的题目是正确的,因为我不知道如何准确地解释它.考虑下面的代码:

lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))

    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)
Run Code Online (Sandbox Code Playgroud)

为什么要写for rho,theta in lines[0]:?通过这种代码,我只能获得一行.我试图删除索引,lines但我得到了ValueError: need more than 1 value to unpack.我试图打印返回的值,它看起来像这样:

[[[ 287.            1.97222209]]

[[ 885.            1.20427716]]

[[ 881.            1.22173047]]]
Run Code Online (Sandbox Code Playgroud)

我有点解决了这个问题,我的代码看起来像这样:

lines = cv2.HoughLines(edges,1,np.pi/180,200)
for i in range(10):
    for rho,theta in lines[i]:
Run Code Online (Sandbox Code Playgroud)

我想知道,到底发生了什么?或者我在这里做错了什么?

python opencv hough-transform

9
推荐指数
2
解决办法
3483
查看次数

图像中的鲁棒线提取

我需要从下面的图像中提取所有墙边(包括地板,墙壁交叉点和墙壁,门交叉点).如果我使用canny检测和霍夫变换(概率).它给了我许多冗余和不必要的线条.我正在寻找是否可以在运行hough变换之前改进canny图像.

输入图像 输入图像

以下是由canny检测算法给出的canny图像
我使用canny参数作为最小和最大阈值的0,20.我不能使用非常高的最大阈值值,否则我将失去墙边,但与图像的其余部分相比,渐变将会很低.
正常的Canny图像

我想在窗口中识别高密度点集群,如果它高于某个阈值则将它们设置为零.

以下是之后获得的精确图像.您可以看到墙边缘被保留. 修改了Canny图像

有谁能建议我更好的方法来处理这个问题?我的意思是改进精确的图像,这样我就可以识别出随机点的集群,然后将它们设置为零.我在考虑在窗口中检查共线点,但不知道它会有多有效?任何评论都会受到欢迎

algorithm opencv image-processing computer-vision hough-transform

8
推荐指数
1
解决办法
1295
查看次数

眼镜检测

我要做的是测量眼镜框的厚度.我有想法测量框架轮廓的厚度(可能是更好的方法?).到目前为止,我已经概述了眼镜的框架,但是有些线条不符合.我想过使用HoughLinesP,但我不确定这是否是我需要的.

到目前为止,我已经执行了以下步骤:

  • 将图像转换为灰度
  • 在眼睛/眼镜区域周围创建投资回报率
  • 模糊图像
  • 扩大图像(这样做是为了去除任何薄框眼镜)
  • 进行Canny边缘检测
  • 找到轮廓

这些是结果:

到目前为止这是我的代码:

//convert to grayscale
cv::Mat grayscaleImg;
cv::cvtColor( img, grayscaleImg, CV_BGR2GRAY );

//create ROI
cv::Mat eyeAreaROI(grayscaleImg, centreEyesRect);
cv::imshow("roi", eyeAreaROI);

//blur
cv::Mat blurredROI;
cv::blur(eyeAreaROI, blurredROI, Size(3,3));
cv::imshow("blurred", blurredROI);

//dilate thin lines
cv::Mat dilated_dst;
int dilate_elem = 0;
int dilate_size = 1;
int dilate_type = MORPH_RECT;

cv::Mat element = getStructuringElement(dilate_type, 
    cv::Size(2*dilate_size + 1, 2*dilate_size+1), 
    cv::Point(dilate_size, dilate_size));

cv::dilate(blurredROI, dilated_dst, element);
cv::imshow("dilate", dilated_dst);

//edge detection
int lowThreshold = 100;
int ratio = 3;
int kernel_size = …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing hough-transform canny-operator

8
推荐指数
1
解决办法
2689
查看次数

用Hough变换检测圆

我正在尝试使用霍夫变换来检测圆圈.

在此输入图像描述

使用我当前的代码,我可以检测到下面的代码

在此输入图像描述

但是我想在我检测到的圆圈内找到黑洞.然而,改变houghcircle方法的参数对我没有帮助.实际上它找到了不存在的圆圈.

在此输入图像描述

此外,我已经尝试裁剪我发现的圆圈,并在这个新的部分做另一个hough变换它也没有帮助我.

这是我的代码

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/opencv.hpp"  // needs imgproc, imgcodecs & highgui
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat src, circleroi;

    /// Read the image
    src = imread( "/Users/Rodrane/Documents/XCODE/test/mkedenemeleri/alev/delikli/gainfull.jpg", 2 );


    /// Convert it to gray
//    cvtColor( src, src_gray, CV_BGR2GRAY );
       /// Reduce the noise so we avoid false circle detection
   GaussianBlur( src, src, Size(3, 3), …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing feature-detection hough-transform

8
推荐指数
1
解决办法
3889
查看次数

HoughLines中rho和theta参数的解释

你能给我一个OpenCV的HoughLines函数的快速定义rhotheta参数吗?

void cv::HoughLines (   InputArray  image,
    OutputArray     lines,
    double  rho,
    double  theta,
    int     threshold,
    double  srn = 0,
    double  stn = 0,
    double  min_theta = 0,
    double  max_theta = CV_PI 
)
Run Code Online (Sandbox Code Playgroud)

我在文档中找到的唯一一件事是:

rho:累加器的距离分辨率,以像素为单位.

theta:累加器的角度分辨率,以弧度表示.

这意味着,如果我设置,rho=2那么我的图像的1/2的像素将被忽略...一种步幅= 2?

opencv image-processing hough-transform

8
推荐指数
2
解决办法
5469
查看次数

线段检测器与Probabalistic Hough变换

在OpenCV中,有两种检测线的方法,它们以端点矢量的形式给出类似的结果 - 线段检测器(LSD)概率霍夫变换.(折扣标准霍夫变换作为给定的输出是根据方程而不是线端点.)

我无法找到这两种线检测方法及其优缺点的比较和对比.因此 - 这两个功能有什么区别?使用一种方法而不是另一种方法有什么特别的好处吗?

另外,还有其他鲜为人知的线路检测方法(如LSD)在某些用例中可能有用吗?

opencv image-processing computer-vision hough-transform

8
推荐指数
1
解决办法
4793
查看次数

OpenCV:使用霍夫圆变换来检测虹膜

我是openCV的新手,但我想创建虹膜识别程序.虽然带网络摄像头的系统可以检测到眼睛,但是它不能检测到圆形虹膜.我正在使用Hough Circle Transformation.但是如果图像中的光圈不够圆,系统就无法检测到它.有什么解决方案吗?

使用的算法是霍夫圆变换.

IplImage *capturedImg = cvLoadImage("circle.jpg",1);
IplImage *grayscaleImg = cvCreateImage(cvGetSize(capturedImg), 8, 1);

cvCvtColor(capturedImg, grayscaleImg, CV_BGR2GRAY);

// Gaussian filter for less noise
cvSmooth(grayscaleImg, grayscaleImg, CV_GAUSSIAN,9, 9 );

//Detect the circles in the image
CvSeq* circles = cvHoughCircles(grayscaleImg,
                         storage,
                         CV_HOUGH_GRADIENT,
                         2,
                         grayscaleImg->height/4,
                         200,
                     100 );

for (i = 0; i < circles->total; i++) 
{
     float* p = (float*)cvGetSeqElem( circles, i );
     cvCircle( capturedImg, cvPoint(cvRound(p[0]),cvRound(p[1])), 
        3, CV_RGB(0,255,0), -1, 8, 0 );
     cvCircle( capturedImg, cvPoint(cvRound(p[0]),cvRound(p[1])), 
         cvRound(p[2]), CV_RGB(0,0,255), 3, 8, 0 );
} …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing hough-transform iris-recognition

7
推荐指数
1
解决办法
1万
查看次数

从Hough线选择线

我正在使用Hough Lines对此图像进行角点检测.我计划找到线的交叉点作为角落.这是图像. 在此输入图像描述

不幸的是,霍夫为我期望的每一行返回了很多行 在此输入图像描述

如何调整霍夫线,使每条只有四条线对应图像上的实际线?

opencv computer-vision hough-transform

7
推荐指数
3
解决办法
7395
查看次数