Chúng tôi bắt đầu với việc tìm hiểu cơ bản về OpenCV và sau đó thực hiện một số thao tác và xử lý hình ảnh cơ bản trên hình ảnh, tiếp theo là Phân đoạn hình ảnh và nhiều thao tác khác sử dụng OpenCV và ngôn ngữ python. Ở đây, trong phần này, chúng ta sẽ thực hiện một số kỹ thuật phát hiện đối tượng đơn giản bằng cách sử dụng đối sánh mẫu. Chúng tôi sẽ tìm một đối tượng trong một hình ảnh và sau đó chúng tôi sẽ mô tả các tính năng của nó. Các tính năng là các thuộc tính chung của hình ảnh như góc, cạnh, v.v. Chúng ta cũng sẽ xem xét một số thuật toán phát hiện đối tượng phổ biến và thông dụng như SIFT, SURF, FAST, BREIF & ORB.
Như đã nói trong các bài hướng dẫn trước, OpenCV là Thư viện nguồn mở Commuter Vision có giao diện C ++, Python và Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. Vì vậy, nó có thể dễ dàng cài đặt trong Raspberry Pi với môi trường Python và Linux. Và Raspberry Pi với OpenCV và camera kèm theo có thể được sử dụng để tạo nhiều ứng dụng xử lý hình ảnh thời gian thực như Nhận diện khuôn mặt, khóa khuôn mặt, theo dõi đối tượng, phát hiện biển số ô tô, Hệ thống an ninh gia đình, v.v.
Phát hiện và nhận dạng đối tượng tạo thành trường hợp sử dụng quan trọng nhất cho thị giác máy tính, chúng được sử dụng để làm những việc mạnh mẽ như
- Dán nhãn cảnh
- Điều hướng Robot
- Ô tô tự lái
- Nhận dạng cơ thể (Microsoft Kinect)
- Phát hiện bệnh và ung thư
- Nhận dạng khuôn mặt
- Nhận dang chu Viet
- Xác định các đối tượng trong ảnh vệ tinh
Nhận diện đối tượng VS Nhận dạng
Nhận dạng đối tượng là cấp độ phát hiện đối tượng thứ hai, trong đó máy tính có thể nhận ra một đối tượng từ nhiều đối tượng trong một hình ảnh và có thể nhận dạng nó.
Bây giờ, chúng ta sẽ thực hiện một số chức năng xử lý ảnh để tìm một đối tượng từ ảnh.
Tìm một đối tượng từ một hình ảnh
Ở đây chúng tôi sẽ sử dụng đối sánh mẫu để tìm ký tự / đối tượng trong hình ảnh, sử dụng hàm cv2.matchTemplate () của OpenCV để tìm đối tượng đó
import cv2 import numpy as np
Tải hình ảnh đầu vào và chuyển đổi nó thành màu xám
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', image) cv2.waitKey (0) gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Tải hình ảnh mẫu
template = cv2.imread ('waldo.jpg', 0) # kết quả đối sánh mẫu của đối tượng trên kết quả hình ảnh = cv2.matchTemplate (xám, mẫu, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (kết quả)
Tạo hộp giới hạn
top_left = max_loc # tăng kích thước của hình chữ nhật giới hạn lên 50 pixel bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (hình ảnh, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('tìm thấy đối tượng', image) cv2.waitKey (0) cv2.destroyAllWindows ()
Trong cv2.matchTemplate (xám, mẫu, cv2.TM_CCOEFF) , nhập hình ảnh thang xám để tìm đối tượng và mẫu. Sau đó, áp dụng phương pháp đối sánh mẫu để tìm các đối tượng từ hình ảnh, ở đây cv2.TM_CCOEFF được sử dụng.
Toàn bộ hàm trả về một mảng được nhập vào kết quả, là kết quả của thủ tục so khớp mẫu.
Và sau đó, chúng tôi sử dụng cv2.minMaxLoc (kết quả) , cung cấp tọa độ hoặc hộp giới hạn nơi đối tượng được tìm thấy trong một hình ảnh và khi chúng tôi nhận được các tọa độ đó, hãy vẽ một hình chữ nhật trên nó và kéo dài một chút kích thước của hộp để đối tượng có thể dễ dàng phù hợp với bên trong hình chữ nhật.
Có nhiều phương pháp để thực hiện đối sánh mẫu và trong trường hợp này, chúng tôi đang sử dụng cv2.TM_CCOEFF , viết tắt của hệ số tương quan.
Ở đây các điểm chính là tọa độ (X, Y) được trích xuất bằng cách sử dụng máy dò sàng và được vẽ trên hình ảnh bằng cách sử dụng chức năng điểm chính vẽ cv2.
LƯỚT SÓNG
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Tạo đối tượng Trình phát hiện tính năng SURF, ở đây chúng tôi đặt ngưỡng hessian thành 500
lướt = cv2.xfeatures2d.SURF_create (500) keypoints, descriptors = lướt.detectAndCompute (xám, None) print ("Số lượng keypoint được phát hiện:", len (keypoints))
Vẽ các điểm chính phong phú trên hình ảnh đầu vào
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Đầu ra bảng điều khiển:
NHANH
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Tạo đối tượng FAST Detector
fast = cv2.FastFeatureDetector_create () # Lấy các điểm chính, theo mặc định không triệt tiêu tối đa là Bật # để tắt thiết lập fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (xám, Không có) print ("Số lượng keypoint Đã phát hiện: ", len (keypoints))
Vẽ các điểm chính phong phú trên hình ảnh đầu vào
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - FAST', image) cv2.waitKey () cv2.destroyAllWindows ()
Đầu ra bảng điều khiển:
SƠ LƯỢC
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Tạo đối tượng dò NHANH
vắn tắt = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Tạo đối tượng trích xuất SƠ LƯỢC
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Xác định điểm chính keypoints = fast.detect (xám, Không có)
Nhận bộ mô tả và các điểm chính cuối cùng mới bằng cách sử dụng BRIEF
keypoints, descriptors =rief.compute (xám, keypoints) print ("Số lượng keypoint được phát hiện:", len (keypoints))
Vẽ các điểm chính phong phú trên hình ảnh đầu vào
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', image) cv2.waitKey () cv2.destroyAllWindows ()
Đầu ra bảng điều khiển:
ORB
import cv2 import numpy as np image = cv2.imread ('paris.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Tạo đối tượng ORB, chúng ta có thể chỉ định số lượng điểm chính mà chúng ta mong muốn
orb = cv2.ORB_create () # Xác định các điểm chính keypoints = orb.detect (xám, Không có)
Lấy bộ mô tả
keypoints, descriptors = orb.compute (xám, keypoints) print ("Số lượng keypoint được phát hiện:", len (keypoints))
Vẽ các điểm chính phong phú trên hình ảnh đầu vào
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - ORB', image) cv2.waitKey () cv2.destroyAllWindows ()
Đầu ra bảng điều khiển:
Chúng tôi có thể chỉ định số lượng điểm khóa có giới hạn tối đa là 5000, tuy nhiên giá trị mặc định là 500, tức là ORB sẽ tự động phát hiện 500 điểm khóa tốt nhất nếu không được chỉ định cho bất kỳ giá trị nào của điểm khóa.
Vì vậy, đây là cách phát hiện đối tượng diễn ra trong OpenCV, các chương trình tương tự cũng có thể chạy trong Raspberry Pi được cài đặt OpenCV và có thể được sử dụng như một thiết bị di động như Điện thoại thông minh có Google Lens.
Bài viết này được tham khảo từ Master Computer Vision ™ OpenCV4 bằng Python với khóa học Deep Learning trên Udemy, do Rajeev Ratan tạo, hãy đăng ký để tìm hiểu thêm về Computer Vision và Python.