Theo dõi đối tượng theo màu sử dụng Raspberry Pi và Camera CSI
15:56 - 17/04/2019
Theo dõi đối tượng theo màu sử dụng Raspberry Pi và Camera CSI
NVIDIA Jetson AGX Orin Hardware Layout and GPIO Expansion Header Pinout
NVIDIA Jetson là nền tảng hàng đầu thế giới dành cho Trí tuệ nhân tạo (AI) và Deep Learning
Cách sử dụng Camera CSI với hệ điều hành Raspberry Pi Bulleyes mới nhất
Jetson Stats dùng cho Giám sát và Điều khiển trên NVIDIA Jetson Ecosystem [Xavier NX, Nano, AGX Xavier, TX1, TX2]
Theo dõi đối tượng theo màu sử dụng Raspberry Pi và Camera cho Raspberry Pi.
Chào mừng các bạn đã quay trở lại với loạt bài viết về xử lý ảnh trên nền Raspberry Pi với thư viện OpenCV. Hôm nay mình sẽ giới thiệu đến các bạn một chủ đề khá thú vị đó là Tracking Object by Color ( Theo dõi đối tượng theo màu sắc ).
Để theo dõi đối tượng thì có nhiều cách khác nhau như :
+ Theo dõi theo màu sắc
+ Theo dõi hình dạng, …
Cách đơn giản nhất trong số đó là theo dõi đối tượng theo màu. Chúng ta sẽ đi xác định màu sắc của vật thể cần tìm và tìm vật thể theo màu đó.
Trong trường hợp này chúng ta sử dụng hệ màu HSV là phù hợp nhất để tìm ra một màu sắc nào đó.
HSV hay còn gọi là không gian màu HSB là một không gian màu dựa trên 3 thông số chính của không gian màu :
+ H viết tắt của từ HUE có nghĩa là vùng màu
+ S Viết tắt của từ SATURATION có nghĩa là độ bảo hòa màu .
+ V viết tắt của chữ VALUE có nghĩ là giá trị hay độ sáng của màu sắc.
Hình ảnh đầu vào của chúng ta có định dạng mặc định là BGR. Có hơn 150 phương thức chuyển đổi không gian màu có sẵn trong OpenCV. Tuy nhiên phương thức chúng ta cần dùng đến ở đây là chuyển đổi BGR >>HSV. Chúng ta sẽ thực hiện bằng việc sử dụng hàm : cv2.cvtColor(input_image,cv2.COLOR_BGR2HSV).
Tiếp đến chúng ta sẽ chỉ ra đâu là màu mà chúng ta cần theo dõi bằng cách thay đổi giá trị của Trackbar. Chúng ta sử dụng hàm cv2.findContours() để tìm đường viền trong mark. Sau đó chúng ta sẽ dùng hàm cv2.moments() để tìm ra trọng tâm của vùng màu đó.
Công việc của chúng ta sẽ gồm có 3 bước :
Bước 1 : Tạo các Trackbar và lấy hình ảnh từ camera
Chương trình của chúng ta cần biết màu cần tìm trong khoảng nào của 3 kênh HSV.
Chúng ta cần có 6 Trackbar tương ứng với 3 kênh H, S, V mỗi kênh có 2 Trackbar là min và max cụ thể ở đây là [H_min,; H_max], [S_min; S_max], [V_min; V_max].
Bước 2 : Tách màu cần tìm dựa vào giá trị của Trackbar.
Ở đây chúng ta sử dụng hàm cv2.inRange() để làm công việc tách màu trên.
Bước 3 : Tìm trọng tâm của vùng màu cần tìm
Chúng ta sử dụng hàm cv2.moments() để tìm trọng tâm của vùng màu cần tìm.
Các bạn có thể gõ lại đoạn code dưới đây hoặc tải xuống từ github tại đây. (Tracking_Object by Color_with_Raspberry_Pi.py)
import cv2 import numpy as np from picamera.array import PiRGBArray from picamera import PiCamera def nothing(x): pass # create Trackbars cv2.namedWindow("Trackbars") cv2.createTrackbar("H_min", "Trackbars", 0, 179, nothing) cv2.createTrackbar("S_min", "Trackbars", 0, 255, nothing) cv2.createTrackbar("V_min", "Trackbars", 0, 255, nothing) cv2.createTrackbar("H_max", "Trackbars", 179, 179, nothing) cv2.createTrackbar("S_max", "Trackbars", 255, 255, nothing) cv2.createTrackbar("V_max", "Trackbars", 255, 255, nothing) # initialize the camera and grab a reference to the raw camera capture camera = PiCamera() camera.resolution = (320, 240) camera.framerate = 24 rawCapture = PiRGBArray(camera, size=(320, 240)) # capture frames from the camera for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): # convert frame to array image = frame.array # converting frame(img == BGR) to HSV(hue-saturation-value) hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # get value Trackbars H_min = cv2.getTrackbarPos("H_min", "Trackbars") S_min = cv2.getTrackbarPos("S_min", "Trackbars") V_min = cv2.getTrackbarPos("V_min", "Trackbars") H_max = cv2.getTrackbarPos("H_max", "Trackbars") S_max = cv2.getTrackbarPos("S_max", "Trackbars") V_max = cv2.getTrackbarPos("V_max", "Trackbars") # Morphological Transformations,Opening and Closing thresh = cv2.inRange(hsv, np.array([H_min, S_min, V_min]), np.array([H_max, S_max, V_max])) kernel = np.ones((5,5),np.uint8) mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) result = cv2.bitwise_and(image,image, mask= mask) # find contours in the mask and initialize the current (x, y) center of the Objective cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2] center = None # only proceed if at least one contour was found if len(cnts) > 0: # find the largest contour in the mask, then use it to compute the minimum enclosing circle and centroid c = max(cnts, key=cv2.contourArea) ((x, y), radius) = cv2.minEnclosingCircle(c) M = cv2.moments(c) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # only proceed if the radius meets a minimum size if radius > 10: # draw the circle and centroid on the frame, then update the list of tracked points cv2.circle(image, (int(x), int(y)), int(radius),(0, 255, 255), 2) cv2.circle(image, center, 3, (0, 0, 255), -1) cv2.putText(image,"centroid", (center[0]+10,center[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4,(0, 0, 255),1) cv2.putText(image,"("+str(center[0])+","+str(center[1])+")", (center[0]+10,center[1]+15), cv2.FONT_HERSHEY_SIMPLEX, 0.4,(0, 0, 255),1) # show the frame to our screen cv2.imshow("Original", image) cv2.imshow("Detected", result) cv2.imshow("Mask", mask) if cv2.waitKey(1) & 0xFF == ord('q'): exit() rawCapture.truncate(0) cv2.destroyAllWindows() |
Kết quả chúng ta thu được nhau sau :
Ở đây mình theo dõi đối tượng với màu ở đây là màu vàng. Các bạn có thể điều chỉnh TrackBar theo màu sắc của đối tượng mà các bạn muốn theo dõi nhé.
Nếu các bạn có bất kỳ ý tưởng mới nào đừng ngần ngại mà hãy inbox trực tiếp cho fanpage . Xin chào và hẹn gặp lại các bạn trong các bài viết tiếp theo !!!
PIVIETNAM.COM.VN CHÚC CÁC BẠN THÀNH CÔNG !!!
Thực hiện bài viết : Đào Văn Hậu
Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :
Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!
Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.