Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การตรวจจับสายใน python ด้วย OpenCV?


ในบทความนี้ เราจะมาเรียนรู้วิธีตรวจจับเส้นในภาพโดยใช้เทคนิคที่เรียกว่า Hough transform

Hough แปลง?

การแปลง Hough เป็นวิธีการแยกคุณลักษณะเพื่อตรวจจับรูปร่างง่ายๆ หากคุณสามารถแสดงรูปร่างนั้นในรูปแบบทางคณิตศาสตร์ มันสามารถตรวจจับรูปร่างได้แม้ว่าจะหักหรือบิดเบี้ยวเล็กน้อยก็ตาม เราจะดูว่ามันทำงานอย่างไรสำหรับเส้น

รูปร่าง "เรียบง่าย" คือรูปร่างที่สามารถแสดงได้ด้วยพารามิเตอร์เพียงไม่กี่ตัว ตัวอย่างเช่น เส้นสามารถแสดงได้ด้วยพารามิเตอร์สองตัวเท่านั้น (ความชัน จุดตัด) และวงกลมมีสามพารามิเตอร์ – พิกัดของจุดศูนย์กลางและรัศมี (x,y, r)

ตรวจจับเส้นจากรูปภาพโดยใช้การแปลง Hough

เส้นสามารถแสดงด้วยสมการ หรือในรูปแบบพาราเมตริก โดยที่ (ρ) คือระยะตั้งฉากจากจุดกำเนิดถึงเส้นตรง และ ϴ คือมุมที่เกิดจากเส้นตั้งฉากและแกนนอนที่วัดเป็นตัวนับ -ตามเข็มนาฬิกา (การแสดงนี้ใช้ใน OpenCV) ตรวจสอบภาพด้านล่าง


การตรวจจับสายใน python ด้วย OpenCV?

ดังนั้นหากเส้นผ่านต่ำกว่าจุดกำเนิด มันจะมี rho เป็นบวกและมุมน้อยกว่า 180 ถ้ามันอยู่เหนือจุดกำเนิด แทนที่จะถ่ายมุมที่มากกว่า 180 มุมจะถูกถ่ายน้อยกว่า 180 และ rho จะถูกลบ เส้นแนวตั้งใดๆ จะมี 0 องศา และเส้นแนวนอนจะมี 90 องศา

ตัวสะสม

บรรทัดใดๆ สามารถแสดงได้ในสองคำนี้ (ρ,ϴ) ขั้นแรก ให้สร้างอาร์เรย์ 2 มิติหรือตัวสะสม (เพื่อเก็บค่าของพารามิเตอร์สองตัว) และตั้งค่าเป็น 0 ในตอนแรก โดยที่แถวแสดงถึง ρ และคอลัมน์แสดงถึง ϴ ขนาดของอาร์เรย์ขึ้นอยู่กับความแม่นยำที่เราต้องการ เช่น หากเราต้องการความแม่นยำของมุม 1 องศา คุณต้องมี 180 คอลัมน์ และ ρ คือระยะทางสูงสุดที่เป็นไปได้คือความยาวแนวทแยงของภาพ และ ρ คือระยะทางสูงสุดที่เป็นไปได้ คือความยาวแนวทแยงของภาพ ดังนั้นการถ่ายด้วยความแม่นยำ 1 พิกเซลและจำนวนแถวอาจเป็นความยาวแนวทแยงของภาพ

พิจารณาว่าเรามีรูปภาพขนาด 100*100 โดยมีเส้นแนวนอนอยู่ตรงกลาง ใช้จุดแรกของเส้น และเรารู้ค่า (x,y) ของมัน ในสมการนี้ ให้ใส่ค่า ϴ=0,1,2,3…180 แล้วตรวจสอบค่า ρ ที่คุณได้รับ สำหรับทุกคู่ (ρ,ϴ) ค่าที่เพิ่มขึ้นทีละหนึ่งคือตัวสะสมของเราในเซลล์ (ρ,ϴ) ที่สอดคล้องกัน ตอนนี้ในตัวสะสม เซลล์ (50,90) =1 พร้อมกับเซลล์อื่นๆ ตอนนี้ใช้จุดที่สองในบรรทัด ทำซ้ำขั้นตอนเดียวกันกับที่เราทำในครั้งแรก เพิ่มค่าในเซลล์ที่สอดคล้องกับ (ρ,ϴ) ที่คุณได้รับ คราวนี้ เซลล์ (50,90)=2 ดังนั้นเราจึงลงคะแนนค่า (ρ,ϴ) จริงๆ เราดำเนินการตามขั้นตอนนี้ต่อไปสำหรับทุกจุดในบรรทัด ในแต่ละจุด เซลล์ (50,90) จะเพิ่มขึ้นหรือลงคะแนน ในขณะที่เซลล์อื่นๆ อาจไม่ได้รับการโหวต ด้วยวิธีนี้ ในตอนท้าย เซลล์ (50,90) จะได้รับคะแนนโหวตสูงสุด ดังนั้น หากคุณค้นหาคะแนนสูงสุดจากตัวสะสม คุณจะได้ค่า (50,90) ซึ่งระบุว่ามีเส้นในภาพนี้ที่ระยะห่าง 50 จากจุดเริ่มต้นและที่มุม 90 องศา นี่คือลักษณะการทำงานของ hough transform สำหรับเส้น

Hough Transform ใน OpenCV

ทุกอย่างที่อธิบายข้างต้นถูกห่อหุ้มไว้ในฟังก์ชัน OpenCV, cv2.HoughLines() โดยจะคืนค่าอาร์เรย์ของค่า (ρ,ϴ) โดยที่ ρ วัดเป็นพิกเซลและ ϴ วัดเป็นเรเดียน

ด้านล่างนี้เป็นโปรแกรมตรวจจับเส้นโดยใช้ openCV และการแปลงเส้น hough

ด้านล่างนี้เป็นภาพจริงของที่จอดรถ และเรากำลังจะทำการตรวจจับเส้นบนภาพนี้โดยใช้การแปลงเส้น hough และไลบรารี OpenCV

การตรวจจับสายใน python ด้วย OpenCV?

ตัวอย่าง

import cv2
import numpy as np
img = cv2.imread("parkingLot1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 75, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, maxLineGap=250)
for line in lines:
   x1, y1, x2, y2 = line[0]
   cv2.line(img, (x1, y1), (x2, y2), (0, 0, 128), 1)
cv2.imshow("linesEdges", edges)
cv2.imshow("linesDetected", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ผลลัพธ์

การตรวจจับสายใน python ด้วย OpenCV?

และเส้นที่ตรวจพบ−

การตรวจจับสายใน python ด้วย OpenCV?