我正在开发一个检测图像中圆形形状的程序。我认为 Hough 变换是最好的,我在 OpenCV 库中找到了一个。问题是,当我尝试使用它时,出现了一个我不知道如何修复的错误。Python 的 OpenCV 没有完全实现吗?是否有修复程序运行所需的库?
这是代码:
import cv
#cv.NamedWindow("camera", 1)
capture = cv.CaptureFromCAM(0)
while True:
img = cv.QueryFrame(capture)
gray = cv.CreateImage(cv.GetSize(img), 8, 1)
edges = cv.CreateImage(cv.GetSize(img), 8, 1)
cv.CvtColor(img, gray, cv.CV_BGR2GRAY)
cv.Canny(gray, edges, 50, 200, 3)
cv.Smooth(gray, gray, cv.CV_GAUSSIAN, 9, 9)
storage = cv.CreateMat(1, 2, cv.CV_32FC3)
#This is the line that throws the error
cv.HoughCircles(edges, storage, cv.CV_HOUGH_GRADIENT, 2, gray.height/4, 200, 100)
#cv.ShowImage("camera", img)
if cv.WaitKey(10) == 27:
break
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
OpenCV 错误:未知函数中的空 pinter (),文件 ..\..\..\..\ocv\openc\src\cxcore\cxdatastructs.cpp,第 408 行 Traceback(最近一次调用):文件“ellipse-检测 …

附加的图像是Opencv 2.4.2的Hough变换的输出
你能用最好的算法告诉我从这些线段中检测最好的四边形(不总是矩形)形状
即使某些角落位于图像边界之外,我仍然需要检测它们
非常感谢
opencv artificial-intelligence image-processing shapes hough-transform
我在图像中有一个简单的网格,我试图确定网格大小,例如6x6,12x12等.使用Python和cv2.

我正在用上面的3x3网格测试它,我计划通过在图像中检测它们来计算有多少垂直/水平线来确定网格大小:
import cv2
import numpy as np
im = cv2.imread('photo2.JPG')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
imgSplit = cv2.split(im)
flag,b = cv2.threshold(imgSplit[2],0,255,cv2.THRESH_OTSU)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(1,1))
cv2.erode(b,element)
edges = cv2.Canny(b,150,200,3,5)
while(True):
img = im.copy()
lines = cv2.HoughLinesP(edges,1,np.pi/2,2, minLineLength = 620, maxLineGap = 100)[0]
for x1,y1,x2,y2 in lines:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),1)
cv2.imshow('houghlines',img)
if k == 27:
break
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
我的代码检测到这些行,如下所示,但是我的图像中每行都检测到多行:

(图像中的每一行都有两条1px绿线)
我不能简单地将行数除以2,因为(取决于网格大小)有时只绘制一行.
如何更准确地检测并绘制原始图像中检测到的每一行的单行?
我调整了阈值设置,将图像缩小为黑白,但仍然有多行.我认为这是因为canny边缘检测?
我使用 opencv hough 变换来尝试检测形状。使用 HoughLines 方法可以很好地检测到较长的线条。但较短的线条被完全忽略。有没有办法也检测较短的线?
我正在使用的代码在这个页面上有描述 http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html
我对房子的角落等线条更感兴趣。我应该修改哪个参数来使用霍夫变换来做到这一点?或者有没有我应该研究的不同算法

python opencv computer-vision hough-transform straight-line-detection
我试图找到下图中的所有多边形(包括填充的多边形)。目前,我正在尝试使用Hough Transform来完成此操作,但它没有检测到图像中的所有线条。此外,由于线条有多宽,它会将每条线条计数两次。有没有办法对图像应用一些过滤器以使霍夫变换性能更好,或者是否有一种完全不同的方法来找到我丢失的多边形?谢谢!
这是我正在处理的图片,

我的代码如下。
import cv2
import numpy as np
img = cv2.imread('test.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for num in range (0, len(lines)):
for x1,y1,x2,y2 in lines[num]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imwrite('houghlines.jpg',img)
Run Code Online (Sandbox Code Playgroud) python opencv computer-vision hough-transform canny-operator
我在 OpenCV (c++) 中实现了霍夫线变换,我在霍夫空间中得到了奇怪的工件。下图显示了霍夫空间。距离 rho 在行中描绘,而 180 列表示从 0 到 179 度的角度。如果放大第 45 和 135 列,您会看到一条垂直线,其中暗像素和亮像素交替出现。 http://imgur.com/NDtMn6S
对于更高的阈值,可以很好地检测到围栏的线条,但是当我降低阈值时,在最终图片中可以将伪影视为 45° 或 135° 旋转的线条: 检测到中等阈值的线条
起初我认为这是我实现霍夫线方法的错误,但使用 OpenCV 的霍夫线方法获得了中等阈值的类似线。使用 Canny 而不是 Sobel 时,我也遇到了同样的问题。
所以问题是:为什么我会得到这些文物,我该如何摆脱它们?我无法找到任何关于此的信息,任何帮助将不胜感激。
这是我与 OpenCV Hough Lines 方法一起使用的代码:
// read in input image and convert to grayscale
Mat frame = imread("fence.png", CV_LOAD_IMAGE_COLOR);
Mat final_out;
frame.copyTo(final_out);
Mat img, gx, gy, mag, angle;
cvtColor(frame, img, CV_BGR2GRAY);
// get the thresholded maggnitude image
Sobel(img, gx, CV_64F, 1, 0);
Sobel(img, gy, CV_64F, 0, 1);
cartToPolar(gx, gy, …Run Code Online (Sandbox Code Playgroud) 我想检测图像中包含很多子结构的多个(相似)矩形对象。所以,我目前的计划是使用高斯模糊、形态学和边缘检测(Canny)。使用边缘检测后,我得到了这个(阈值参数非常低):
目前我尝试通过使用HoughLines和之findContours后来获得它。对于这项工作,我需要拨弄了很多与门限参数Canny和HoughLines。
当我对一张图像进行正确处理时,参数很可能不适用于下一张(例如,前一张图像中的边缘不太占优势,导致霍夫变换检测到太多线条)。另一个问题是,有时内部结构与外边缘的一侧同等或更少占主导地位。
我尝试使用更强的模糊或形态,但在某些时候这模糊了矩形之间的小间隙。
鉴于边缘图像(最好使用opencv),我可以以其他方式提取更大的矩形吗?获得 4 个角点就足够了。
在检测圆圈之前,我正在用red通道替换green通道。替换通道后,我将其通过模糊过滤器,然后进行霍夫变换以检测圆圈。但是当我这样做时,我收到一条糟糕的错误消息:
OpenCV(3.4.1) Error: Assertion failed (!_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() ||
_image.isUMat())) in HoughCircles, file /io/opencv/modules/imgproc/src/hough.cpp, line 1659
Traceback (most recent call last):
File "circle_light.py", line 44, in <module>
param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)
cv2.error: OpenCV(3.4.1) /io/opencv/modules/imgproc/src/hough.cpp:1659: error: (-215) !_image.empty()
&& _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) in function HoughCircles
Run Code Online (Sandbox Code Playgroud)
我无法理解它,因此无法理解我可能做错了什么。这是我所做的事情的片段。
import cv2
img = cv2.imread("images/{}".format("img.png"), 1) …Run Code Online (Sandbox Code Playgroud) python opencv image-processing computer-vision hough-transform
我想从扫描的表格中提取信息并将其存储为 csv。现在我的表提取算法执行以下步骤。
该算法适用于数字原生 pdf 和大多数扫描文档。但是,某些文档有一个嘈杂的表格,因此无法正确识别行。
这是我的算法失败的示例图像。
这些是我在这张桌子上做的操作。1.高斯模糊
2.Otsu阈值
3.形态开口
4.Canny边缘检测
5.filtered lines,如您所见,这些线条显然没有正确识别。
任何人都可以提出更好的方法来从这种质量较差的扫描中提取水平线和垂直线。
提前致谢!!
python opencv image-processing hough-transform opencv-python
我正在开发一个使用 OpenCV 的项目,Python 在项目的某些部分使用概率霍夫线变换函数“HoughLinesP”。我的代码工作得很好,没有问题。然后我想到将相同的代码转换为 C++。
将代码转换为 C++ 后,输出与 Python 代码的输出不一样。经过长时间的调试,我发现其他一切正常,但“HoughLinesP”函数在 C++ 的情况下给出了不同的输出。两种语言对这个函数的输入是一样的,参数的值也一样,但是输出是不同的。
有人可以解释一下为什么会发生这种情况以及任何可能的修复方法吗?
此外,我已经检查了两种语言的 OpenCV 版本,它是相同的:
4.5.0 dev
此外,我尝试使用传递给 C++ 代码的值,但我无法获得类似的结果。
输入边缘图像:
Python HoughLinesP() 输出:
C++ HoughLinesP() 输出:
以下是每种语言的代码: Python:
Lines = cv2.HoughLinesP(EdgeImage, 1, np.pi / 180, 50, 10, 15)
Run Code Online (Sandbox Code Playgroud)
C++:
std::vector<cv::Vec4i> Lines;
cv::HoughLinesP(EdgeImage, Lines, 1, CV_PI / 180, 50, 10, 15);
Run Code Online (Sandbox Code Playgroud)
如果有人可以提出建议,那将是一个很大的帮助。