Trong bài toán này, chúng ta sẽ xem cách Python có thể phát hiện cạnh của một tệp ảnh hoặc video. Để đạt được điều này, chúng ta cần thư viện OpenCV. Thư viện OpenCV chủ yếu được thiết kế cho thị giác máy tính. Nó là mã nguồn mở. Ban đầu nó được thiết kế bởi Intel. Đây là miễn phí sử dụng dưới giấy phép BSD mã nguồn mở.
Để sử dụng chức năng OpenCV, chúng ta cần tải chúng xuống sử dụng pip. OpenCV sẽ tải xuống module Numpy. Đó cũng sẽ được cần.
sudo pip3 install opencv-python
Là đầu vào, trong trường hợp này, chúng ta đã sử dụng một tệp video. Chúng ta cũng có thể sử dụng webcam của mình để xem hiệu ứng thời gian thực của quy trình phát hiện cạnh này.
Ở đây chúng ta đang sử dụng một tệp video. Hình ảnh thực tế (khung của video) trông như sau:

Phát hiện cạnh hoạt động như thế nào?
Để phát hiện cạnh, có một số quan sát toán học để kiểm tra xem độ sáng của pixel có đang thay đổi rõ rệt hay không.
Chúng ta cần tìm gradient cho phiên bản grayscale của ảnh của chúng ta. Trong thị giác máy tính, khi pixel chuyển từ đen sang trắng, nó được ghi nhận là độ dốc dương. Đối với chuyển từ trắng sang đen, nó là độ dốc âm.
Phát hiện cạnh sử dụng Đạo hàm của Ảnh
Một ảnh được lưu trữ như một ma trận, nơi mỗi phần tử của ma trận đó giữ thông tin về tất cả pixel. Để tìm đạo hàm chúng ta cần toán tử Laplacian. Vì vậy để lấy Laplacian, trước tiên chúng ta cần các đạo hàm Sobel. Các đạo hàm Sobel này được dùng để lấy biến thể gradient của một ảnh.
Đạo hàm Sobel Ngăn (Sobel X)
Đạo hàm Sobel này được thu được thông qua tích chập của ảnh thực tế và một ma trận khác (gọi là kernel). Kernel là ma trận 3x3 cho trường hợp đơn giản.
Có một hàm gọi là sobel(). Sử dụng hàm này, chúng ta có thể tìm các đạo hàm Sobel. Khi chúng ta cố gắng lấy Sobel x, thì phần y nên là 0.
Mã ví dụ
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') # Capture frames từ tệp video.
while(capture.isOpened()):
# Chạy vòng lặp cho đến khi video kết thúc
ret, frame = capture.read() # Lấy khung hình từ video
# Chuyển đổi màu BGR sang chế độ HSV (Hue Saturation Value)
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Phương thức Sobelx
sobelx = cv2.Sobel(frame, cv2.CV_64F, 1, 0, ksize=5)
cv2.imshow('SobelX', sobelx)
k = cv2.waitKey(5) & 0xFF
if k == 27: # 27 là ASCII cho phím ESC. Khi ESC được nhấn, nó sẽ dừng
break
capture.release()
cv2.destroyAllWindows() # Dọn dẹp bộ nhớ sau khi xóa cửa sổ
Đầu ra

Đạo hàm Sobel Dọc (Sobel Y)
Tương tự chúng ta có thể tìm đạo hàm Sobel dọc sử dụng hàm sobel(). Trong trường hợp này phần x sẽ là 0.
Mã ví dụ
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Phương thức Sobely
sobely = cv2.Sobel(frame, cv2.CV_64F, 0, 1, ksize=5)
cv2.imshow('SobelY', sobely)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
capture.release()
cv2.destroyAllWindows()
Đầu ra

Đạo hàm Laplacian
Cuối cùng chúng ta sẽ xem Đạo hàm Laplacian của ảnh. Có một hàm gọi là Laplacian(). Nó được dùng để lấy đạo hàm.
Mã ví dụ
import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Phương thức Laplacian
laplacian = cv2.Laplacian(frame, cv2.CV_64F)
cv2.imshow('Laplacian', laplacian)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
capture.release()
cv2.destroyAllWindows()
Đầu ra
