我试图在Android手机上使用OpenCV来检测线路.我修改了'Tutorial 1 Basic - 2.使用OpenCV Camera'样本.我也使用霍夫线变换作为例子.但是,我得到了奇怪的数字(至少我认为是奇怪的数字).b的范围是1000到-1000.
我不完全理解代码(主要是关于添加/减去1000*(a或-b)的部分).
最后我根本看不到线条.
有人能帮我一把吗?如果您需要更多信息,请与我们联系.
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Imgproc.Canny(mGray, mIntermediateMat, 80, 100);
Imgproc.HoughLines(mIntermediateMat, mLines, 1, Math.PI/180, 100);
Scalar color = new Scalar(0, 0, 255);
double[] data;
double rho, theta;
Point pt1 = new Point();
Point pt2 = new Point();
double a, b;
double x0, y0;
for (int i = 0; i < mLines.cols(); i++)
{
data = mLines.get(0, i);
rho = data[0];
theta = data[1];
a = Math.cos(theta);
b = Math.sin(theta);
x0 = a*rho;
y0 …
Run Code Online (Sandbox Code Playgroud) 我试图获得校准棋盘的阈值.当我观察微型棋盘时,我无法直接检测到棋盘角落,因为有一些灰尘.我尝试了几种方法,而HoughLinesP似乎是最简单的方法.但结果不好,如何提高我的成绩?
import numpy as np
import cv2
img = cv2.imread('lines.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
print img.shape[1]
print img.shape
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100)
a,b,c = lines.shape
for i in range(a):
cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3, cv2.LINE_AA)
cv2.imwrite('houghlines5.jpg',img)
Run Code Online (Sandbox Code Playgroud)
正如你在下图所示,我无法获得我的棋盘,线条被绘制在很多方向......(原始图片:https://s22.postimg.org/iq2b91xq9/droite_Image_00000.jpg)
如何使用opencv Hough线算法获得线的交点?
这是我的代码:
import cv2
import numpy as np
import imutils
im = cv2.imread('../data/test1.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 60, 150, apertureSize=3)
img = im.copy()
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for line in lines:
for rho,theta in line:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 3000*(-b))
y1 = int(y0 + 3000*(a))
x2 = int(x0 - 3000*(-b))
y2 = int(y0 - 3000*(a))
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),10)
cv2.imshow('houghlines',imutils.resize(img, height=650))
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
输出:
我想得到所有的交点.
我正在编写一个可以在驾驶模拟器中检测车道的应用程序.环境相对简单,大多是直的多车道道路,几乎没有曲率.目前,我可以使用(经典)Hough变换成功检测到线条,但问题是HT自然也会检测到不是车道的线条.
我怎样才能更有选择性?我没有绘制水平线,但仍然有一些线路进入.理想情况下,我想检测车辆行驶的车道边界.以下是环境的典型图像
这是我到目前为止所做的事情:
成像阈值的原因如下.如果你看一下上面链接的环境照片,你会看到一条平行于道路的灰色线条.因为它是一条连续线 - 与车道标记不同 - HT最终检测到它.我不能基于渐变来排除它,因为它具有与车道标记相同的梯度.通过阈值处理,我可以删除它,因此只检测作为实际车道标记的线.
这是上述操作的结果
我知道这个问题有很多解决方案,我已经阅读了无数的论文,但它们似乎都处理的环境比这复杂得多,而且/或者只是简单的方式.为了它的价值,仅仅一个多月前,我没有ComputerVision的背景,所以这对我来说都是非常新的.
更新1:
我想用更好的术语来说,我正在寻找一种模拟车道的方法,以便不包括不适合模型的线.不幸的是,我不知道从哪里开始使用模型.有什么建议?
为了它的价值,我已经设法识别出车辆在其中行驶的车道,并且可以排除不属于"主动"车道的额外线路,可以这么说.希望这张照片会有所帮助
它不完美,但我猜它.在建模之后,我的最终目标是生成车辆的航向/位置.但我只是想首先获得相对强大的车道检测.我希望有一种相对简单的技术可以帮助实现这一点(不依赖于系统的参数,例如视场的焦距).
我正在尝试使用OpenCV从它的背景中分割弯曲的杆,然后在其中找到弯曲并计算每个弯曲之间的角度.
幸运的是,第一部分是微不足道的,前景和背景之间有足够的对比.在分割时,一些侵蚀/扩张会处理反射/高光.
第二部分是我不知道如何处理它的地方.
我可以轻松地检索轮廓(顶部和底部非常相似,所以要么会这样做),但我似乎无法弄清楚如何将轮廓分成直线部分和弯曲杆来计算角度.
到目前为止,我已经尝试过简单地修复轮廓,但要么我得到太多或太少的点,并且感觉很难确定正确的设置以保持笔直部分和弯曲部分简化.
这是我的输入图像(bend.png)
这是我到目前为止所尝试的内容:
#!/usr/bin/env python
import numpy as np
import cv2
threshold = 229
# erosion/dilation kernel
kernel = np.ones((5,5),np.uint8)
# contour simplification
epsilon = 0
# slider callbacks
def onThreshold(x):
global threshold
print "threshold = ",x
threshold = x
def onEpsilon(x):
global epsilon
epsilon = x * 0.01
print "epsilon = ",epsilon
# make a window to add sliders/preview to
cv2.namedWindow('processed')
#make some sliders
cv2.createTrackbar('threshold','processed',60,255,onThreshold)
cv2.createTrackbar('epsilon','processed',1,1000,onEpsilon)
# load image
img = cv2.imread('bend.png',0)
# continuously process …
Run Code Online (Sandbox Code Playgroud) OpenCV中的HoughLines或HoughLinesP函数是否像HoughCircles函数一样以累加器顺序返回行列表?我想知道线的排序.获得线路的累加器值也非常方便,因此可以使用智能和自适应阈值而不是固定阈值.是否可以使用排序或累加器值而无需自行重写OpenCV?
我有以下代码,我想检测圆圈.
img = cv2.imread("act_circle.png")
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray,cv2.CV_HOUGH_GRADIENT)
Run Code Online (Sandbox Code Playgroud)
看起来它没有属性,错误如下
'module' object has no attribute 'CV_HOUGH_GRADIENT'
Run Code Online (Sandbox Code Playgroud)
有谁知道这个隐藏参数在哪里?
谢谢
我需要从视频中检测道路车道.这是我的方式.
cv2.equalizeHist
cv2.adaptiveThreshold
skimage.morphology.skeletonize
cv2.HoughLines
于(6)对于cv2.HoughLines
,我设置为:
rho
是正的(这意味着直线向右倾斜(自下而上),它只会绘制线条,如果它处于某个角度(我设置了角度的范围))rho
是负数(直线向左倾斜(自下而上),只有在特定角度时才会绘制直线)这是我绘制线条的代码:
lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50)
try:
range = lines.shape[0]
except AttributeError:
range = 0
for i in xrange(range):
for rho, theta in lines[i]:
if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10):
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b)) …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个广义Hough变换的OpenCv实现,或者至少在c ++中.尽管我搜索了一段时间,但我还是找不到任何有趣的东西.有什么建议吗?
我正在尝试实现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上不欢迎这类问题,我深表歉意 - 是否有其他网站可以提出有关算法的问题?