TShopping

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

[教學] Python cv2直線偵測

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

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, 2024-4-16 19:00 , Processed in 0.076739 second(s), 26 queries .

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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