TShopping

 找回密碼
 註冊
搜索
查看: 113|回復: 0

[教學] Python cv2直線偵測

[複製鏈接]
發表於 2021-4-8 22:02:28 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  
原圖

Python cv2 直線偵測

Python cv2 直線偵測


完整代碼
  1. import numpy as np
  2. import cv2, os, math
  3. from skimage import io
  4. img1 = cv2.imread('Traffic_Lanes.jpg')
  5. img2 = img1.copy()
  6. gray = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
  7. edges = cv2.Canny(img1, 50, 200)
  8. edges_gray = cv2.Canny(gray, 50, 200)
  9. # cv2.HoughLines 找出來的直線任意角度
  10. lines = cv2.HoughLines(edges_gray, 1, math.pi / 180.0, 200)
  11. cv2.imshow('img2',img2)
  12. # cv2.imshow('Canny1 Image',edges)
  13. # cv2.imshow('Canny2 Imag',edges_gray)
  14. print(lines)
  15. # print(lines.__class__)
  16. print('lines只是空間座標資訊,我們得做轉換處理')
  17. print('lines.shape',lines.shape)
  18. if lines is not None:
  19.     a,b,c = lines.shape
  20.     print('a',a,'b',b,'c',c)
  21.     for i in range(a):
  22.         rho = lines[i][0][0]
  23.         theta = lines[i][0][1]
  24.         # print('rho',rho)
  25.         # print('theta', theta)
  26.         a = math.cos(theta)
  27.         b = math.sin(theta)
  28.         # print('a', a)
  29.         # print('b', b)
  30.         # x0, y0代表繪製直線的原始位置的距離
  31.         # 依照sin與cos的角度關係,找出直線的起訖位置
  32.         # 起點 x0 + 100 * (-b),y0 + 100 * (a)
  33.         # 終點 x0 - 100 * (-b),y0 - 100 * (a)
  34.         # 100 代表直線的長度,長度可以調整
  35.         x0, y0 = a*rho, b*rho
  36.         print('x0', x0,'y0', y0)
  37.         pt1 = ( int(x0 + 1000 * (-b)), int(y0 + 1000 * (a)))
  38.         pt2 = ( int(x0 - 1000 * (-b)), int(y0 - 1000 * (a)))
  39.         print('pt1', pt1, 'pt2', pt2)
  40.         print('依之前計算的座標pt1到pt2的繪製直線')
  41.         cv2.line(img2,pt1,pt2,(255,0,0),1,cv2.LINE_AA)
  42. cv2.imshow('Lines Image', img2)
  43. cv2.imwrite('1000.png',img2)
  44. cv2.waitKey()
複製代碼

• lines=cv2.HoughLines(edges1,1,math.pi/180.0,120)
• 共有四個參數
• 1.輸入的影像,必須是灰階影像。
• 2.rho以像素為單位的距離精度,一般會設定為1。
• 3.theta,代表偵測時角度設定,math.pi/180.0 代表探索所有可能的角度。
• 4.偵測的閥值,這個數值愈小,判定出來的直線就會愈多
• is not None代表有偵測到直線。
• 以這個練習為例,shape為5X1X2。
• lines[0][0]代表rho距離。
• lines[0][1]代表theta角度。
• a的內容代表cos結果。
• b的內容代表sin結果。
• sin代表 三角座標的 高/ 斜
• cos代表三角座標的 底/斜


Python cv2 直線偵測

Python cv2 直線偵測

• 我們知道cv2.HoughLines( )找出來的直線是任意角度。
• x0與y0代表繪製直線的原始位置的距離。
• 我們依照sin與cos的角度關係,找出直線的起訖的位置:
• 起點:x0+1000*(-b),y0+1000*(a)
• 終點:x0-1000*(-b),y0-1000*(a)
• 1000代表直線的長度,長度可以調整。
• 原點於左上角。
• Q:可是sin不是垂直,而cos是水平?
• (tan是斜率)
• A:
• 配合前面HoughLines()方法推算,所以sin與cos是反過來。

• 這一張圖為何天空有直線?

Python cv2 直線偵測

Python cv2 直線偵測


• 圖像以300%比例查看,發現左上角有白色雲彩,與天空顏色不同,而左上角是原點,所以被判斷為直線。
• 可以偵測後將天空區域的座標刪除

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-4-17 10:26 , Processed in 0.061536 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表