2013-09-05 9 views
5

私は線の極座標を持っていますが、OpenCV & pythonの画像にどのように描画できますか?OpenCVでイメージに線を描くには?

Line関数は2ポイントをとりますが、セグメントのみを描画します。私は画像の1つの端から他の端まで線を描きたい。

+0

極座標で線を定義したコードを教えてください。 – jabaldonedo

+0

私はthetaとrhoを持っています。だから私の行はx * cos(theta)-y * sin(theta)=ρです。より正確に言えば、私は自分自身でHough変換を実装しようとしており、画像上のHough空間からの線を視覚化したいと考えています。 – Rahul

+0

楕円は、あなたが探しているものなら、円弧を描くことができます – berak

答えて

9

極北方程式の線をデカルトに変換してから、numpy.vectorize()を使用して、空間の任意の点で線を表現できるベクトルを生成します。

import cv2 
import numpy as np 

img_size = (200,200) 
img = np.ones(img_size) * 255 

# polar equation 
theta = np.linspace(0, np.pi, 1000) 
r = 1/(np.sin(theta) - np.cos(theta)) 

# polar to cartesian 
def polar2cart(r, theta): 
    x = r * np.cos(theta) 
    y = r * np.sin(theta) 
    return x, y 

x,y = polar2cart(r, theta) 
x1, x2, y1, y2 = x[0], x[1], y[0], y[1] 

# line equation y = f(X) 
def line_eq(X): 
    m = (y2 - y1)/(x2 - x1) 
    return m * (X - x1) + y1 

line = np.vectorize(line_eq) 

x = np.arange(0, img_size[0]) 
y = line(x).astype(np.uint) 

cv2.line(img, (x[0], y[0]), (x[-1], y[-1]), (0,0,0)) 
cv2.imshow("foo",img) 
cv2.waitKey() 

結果:

enter image description here

+0

これは良いようです。しかし、私はベクトル化して全体の範囲を計算する必要はないと思います。あなたはx = 0とx = img_size [0]を計算するだけです。 – Rahul

0

あなたはHough Line Transform tutorialでこれを行う方法を見ることができます。

import cv2 
import numpy as np 

img = cv2.imread('dave.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(gray,50,150,apertureSize = 3) 

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) 

cv2.imwrite('houghlines3.jpg',img) 
関連する問題