Cv2.drawcontours trăn

Bài viết ứng dụng OpenCV để nhận định dạng và đếm số lượng vật chất có thể giúp giảm bớt thời gian làm việc thủ công cho con người. You may be apply outside Đậu đếm để đếm nhiều loại vật thể khác nhau với số lượng lớn

Giới thiệu

Hiện nay máy móc giúp đỡ con người trong rất nhiều công việc như cơ khí, vũ trang, nhưng hầu hết các công việc đó máy móc giúp đỡ về phần sức khỏe, về thể chất của con người. Con người suy nghĩ và đưa ra quyết định cho máy móc làm việc, vì vậy phần cốt lõi nếu muốn máy móc làm việc hết công việc đó là máy móc phải nhận dạng xung quanh thế giới

Bài viết này ứng dụng OpenCV vào việc đếm số lượng các vật thể, tôi dùng Python để tiện cho việc viết demo, bạn có thể dùng OpenCV C++ hoặc C# với EmguCV cũng cho kết quả tương tự

Môi trường thử nghiệm

  • Phiên bản Python 3. 6. 5
  • OpenCV version 3. 4. 1

Sử dụng OpenCV trong bài toán đếm đậu

I parti out to twosteps main that is. Nhận định dạng và đếm

Cài đặt thư viện OpenCV và Numpy qua dòng lệnh

pip install opencv-python
pip install numpy

Tôi phải tuyên bố trong kịch bản đoạn để biết những thư viện mà tôi sắp sử dụng

from cv2 import cv2
import numpy as np
from skimage.morphology import opening

Nhận định dạng

Đầu tiên tôi đọc ảnh lên và đặt tên là ảnh

image = cv2.imread["images/dem-dau-voi-opencv.jpg"]

Tạo một bức ảnh màu xám từ ảnh gốc và đặt tên là GrayImage

grayImage = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY]

Tôi sử dụng thuật toán Gaussian để làm mờ các bức ảnh từ bức ảnh xám

blur = cv2.GaussianBlur[grayImage, [9,9], 1]

Tiếp theo tôi sử dụng ngưỡng phương thức thích ứng nhưng tôi nhận thấy rằng bức ảnh của tôi có độ sáng phân bổ không đều nên thay vào đó tôi sử dụng ngưỡng phương thức thích ứng

Chào tuần mới anh Mì AI, hôm nay chúng ta sẽ sử dụng OpenCV thuần với Python để thử đo kích thước các vật thể trong ảnh nhé

Việc làm đo kích thước này mình cũng nói trước mấy luôn điểm

  • Thứ nhất, công việc đo chỉ mang tính chất tham khảo, không thể xác định chính xác 100% như mang kích thước ra đo hoặc sử dụng máy đo chuyên dụng
  • Thứ hai, do ở đây mình sử dụng một máy ảnh bất kỳ làm mẫu, không cân chỉnh máy ảnh một cách bài bản nên có thể kích thước ảnh ảnh hưởng bởi góc nghiêng của máy ảnh

Tuy nhiên, với mục đích học tập thì hoàn toàn có thể nhận được. Ngoài ra mình cũng đã có 1 bài đo khoảng cách tương tự các bạn cũng có thể đọc để tham khảo nhé. tại đây

Okie con yêu. Bắt đầu tìm hiểu nào

Phần 1 – Làm sao để đo kích thước vật thể trong ảnh?

Rõ ràng với logic thông thường thì muốn đo kích thước vật thể trong ảnh ta phải biết được các yếu tố như. Khoảng cách từ máy ảnh đến vật khi chụp, Tiêu cự của máy ảnh, góc chụp…. rất phức tạp như hình bên dưới

Nguồn. at here

Tuy nhiên với anh em Mì sợ học toán thì mình sẽ có một cách đơn giản hơn như sau. [bạn nào thích làm phức hợp có thể nghiên cứu cách căn chỉnh camera tại đây]

  • Đầu tiên ta chọn bất kỳ vật liệu nào mà ta biết kích thước gọi là “Vật tham chiếu“. Ta nên chọn viên bi tròn hay vật gì hình tròn đó để dễ dàng hơn trong công việc tính toán. Giả sử viên bi có đường kính thật $Dr = 2cm = 20mm$
  • Tiếp theo ta đặt các đối tượng tham chiếu đó vào ảnh cùng với các đối tượng muốn đo kích thước và chụp một tấm ảnh
  • Sau đó, Giả sử ta đo được đường kính trong ảnh của Vật tham chiếu là $Dc = 100 pixel$, ta suy ra kích thước thật của 1 pixel là 20/100 = 0. 2mm [goi is number $P$]
  • Bước cuối cung, ta đo kích thước trong ảnh Vật thể muốn đo bằng pixel, sau đó nhân với $P$ sẽ ra kích thước thật của vật thể

Các bạn đã ôm được tinh thần rồi chứ? . https. //Facebook. com/groups/miaigroup để thảo luận nhé

Phần 2 – Triển khai bài toán

Việc đầu tiên là ta phải tìm cách đo được kích thước bằng pixel của các vật thể trong ảnh, đó là yếu tố quyết định đầu tiên cho bài toán này

Giả sử ta có một tấm ảnh như sau và ở đây Vật tham chiếu là đồng xu 1 Rufiuaa của Maldives [kỷ niệm chuyến đi năm tháng của mình kaka] và Vật cần đo là chiếc USB bên cạnh

Ta đã biết đồng xu này có kích thước thật là 2cm = 20mm. Bây giờ chúng ta sẽ cùng nhau thực hiện các bước nhé

Xử lý tiền và truy tìm

Việc đầu tiên là phải thực hiện chuyển đổi về ảnh xám và tìm kiếm cận cảnh để bước sau khi tìm kiếm đường viền

# Đọc file ảnh image = cv2.imread[filename] # Chuyển thành ảnh xám gray = cv2.cvtColor[image, cv2.COLOR_BGR2GRAY] # Làm mờ ảnh gray = cv2.GaussianBlur[gray, [blur_kernel, blur_kernel], 0] # Áp dụng Canny tìm cạnh edged = cv2.Canny[gray, canny_low, canny_high] edged = cv2.dilate[edged, [d_e_kernel, d_e_kernel], iterations=1] edged = cv2.erode[edged, [d_e_kernel, d_e_kernel], iterations=1]

Code language: PHP [php]

Sau bước này ta sẽ có bức ảnh như sau

Nhìn qua ta đã thấy có thể tìm được các đường viền của đồng xu và cái USB rồi. Chú ý ở đây làm nền của mình khá phức tạp nên việc tìm đường viền khá khó,các bạn có thể thử với nền đơn giản hơn [đơn sắc, phẳng…. ] cho dễ nhé

Tìm đường viền và xác định kích thước bằng pixel

Rồi, bay giờ ta sẽ tìm các đường viền trong hình, và loại bỏ các đường viền nhỏ để giữ lại 2 đường viền chính là đồng xu và USB

# Tìm các Contour trong ảnh cnts = cv2.findContours[edged.copy[], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE] cnts = imutils.grab_contours[cnts] # Sắp xếp các contour từ trái qua phải [cnts, _] = contours.sort_contours[cnts] P = None # Duyệt các contour for c in cnts: # Nếu contour quá nhỏ -> bỏ qua if cv2.contourArea[c] < area_threshold: continue

Code language: PHP [php]

Với các đường viền được tìm thấy, chúng tôi sẽ thực hiện tính toán kích thước của nó bằng, tính bằng Pixel. Ở đây chúng ta sử dụng khái niệm MinAreaRect chứ không phải Bounding Box nhé

Các bạn có thể phân biệt theo hình sau [đỏ là MinAreaRect và xanh là giới hạn hộp]

Nguồn. at here

# Lấy minRect box = cv2.minAreaRect[c] # Lấy tọa độ các đỉnh của MinRect box = cv2.boxPoints[box] box = np.array[box, dtype="int"] # Sắp xếp các điểm theo trình tự box = perspective.order_points[box] # Vẽ contour cv2.drawContours[orig, [box.astype["int"]], -1, [0, 255, 0], 2] # Tinh toán 4 trung diểm của các cạnh [tl, tr, br, bl] = box [tltrX, tltrY] = midpoint[tl, tr] [blbrX, blbrY] = midpoint[bl, br] [tlblX, tlblY] = midpoint[tl, bl] [trbrX, trbrY] = midpoint[tr, br] # Tính độ dài 2 chiều dc_W = dist.euclidean[[tltrX, tltrY], [blbrX, blbrY]] dc_H = dist.euclidean[[tlblX, tlblY], [trbrX, trbrY]]

Code language: PHP [php]

Sau bước này, ta đã có kích thước Vật tham chiếu [đồng xu] bằng Pixel, ta sẽ tính toán số $P$ [xem lại phần 1 nếu không nhớ $P$là gì]

$$P = Kích thước thực / Kích thước tính bằng pixel$$

Go to any feature

________số 8_______

Và kích thước thật của các Vật cần đo [USB] là

dr_W = dc_W * P dr_H = dc_H * P

Sau khi đã tính toán xong thì ta chỉ cần vẽ lên ảnh cho đẹp, kẻ các đường viền khung là okie

Full code of this function is

def find_object_in_pix[orig, edge, area_threshold=3000]: # Tìm các Contour trong ảnh cnts = cv2.findContours[edged.copy[], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE] cnts = imutils.grab_contours[cnts] # Sắp xếp các contour từ trái qua phải [cnts, _] = contours.sort_contours[cnts] P = None # Duyệt các contour for c in cnts: # Nếu contour quá nhỏ -> bỏ qua if cv2.contourArea[c] < area_threshold: continue # Tính toán 2 chiều bằng Pixel dc_W, dc_H, tltrX, tltrY, trbrX, trbrY = get_distance_in_pixels[orig, c] # Nếu là đồng xu if P is None: # Cập nhật số P P = ref_width / dc_H # Gán luôn kích thước thật bằng số đã biết dr_W = ref_width dr_H = ref_width else: # Nếu là các vật khác # Tính toán kích thước thật dựa vào kích thước pixel và số P dr_W = dc_W * P dr_H = dc_H * P # Ve kich thuoc len hinh cv2.putText[orig, "{:.1f} mm".format[dr_H], [int[tltrX - 15], int[tltrY - 10]], cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 0, 255], 2] cv2.putText[orig, "{:.1f} mm".format[dr_W], [int[trbrX + 10], int[trbrY]], cv2.FONT_HERSHEY_SIMPLEX, 1, [0, 0, 255], 2] return orig

Code language: PHP [php]

Và bước cuối cùng là hiển thị ảnh đã vẽ với các kiểu lên màn hình

Mình có chia sẻ github có sẵn code để các bạn tải về chạy thử nhé. tại đây. Chú thích cài đặt thư viện bằng lệnh

pip install -r setup.txt

Code language: CSS [css]

Xong rồi,. Đó là bản dã hướng dẫn các bạn sử dụng OpenCV để đo kích thước các vật thể trong máy ảnh được rồi. Các bạn có thể phát triển, ứng dụng cho các bài toán riêng của các bạn nhé

Chủ Đề