Chi tiết cách đo kích thước vật thể bằng OpenCV thuần

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 đo kích thước này mình cũng nói trước luôn mấy điểm:

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

Tuy nhiên, với mục đích học tập thì hoàn toàn chấp 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 dê! 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ừ camera đến vật khi chụp, Tiêu cự của camera, góc chụp…..rất phức tạp như hình dưới:

Nguồn: Tại đây

Tuy nhiên với anh em Mì ngại 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 tạp có thể nghiên cứu cách căn chỉnh camera tại đây).

  • Đầu tiên ta chọn một vật nào đó ta biết kích thước gọi là “Vật tham chiếu“. Ta nên chọn một viên bi tròn hay vật gì đó hình tròn để dễ dàng hơn trong 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 Vật tham chiếu đó vào ảnh cùng với các Vật muốn đo kích thước và chụp một tấm.
  • 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 là số $P$)
  • Bước cuối cung, ta đo kích thước trong ảnh Vật muốn đo bằng pixel, sau đó nhân với $P$ là sẽ ra kích thước thật của vật.

Các bạn đã nắm được tinh thần rồi chứ? Nếu còn vướng mắc thì các bạn cứ post lên Group trao đổi, chia sẻ: 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 trong ảnh, đó là yếu tố tiên quyết 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 ngoái của mình kaka) và Vật cần đo là chiếc USB bên cạnh.

đo kích thước vật thể

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é.

Tiền xử lý và tìm cạnh

Việc đầu tiên là phải thực hiện chuyển về ảnh xám và tìm cạnh để bước sau tìm contour:

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

đo kích thước vật thể

Nhìn qua ta đã thấy có thể tìm được các contour của đồng xu và cái USB rồi. Chú ý là ở đây do nền của mình khá phức tạp nên việc tìm contour 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 contour và xác định kích thước bằng pixel

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

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

Các bạn có thể phân biệt theo hình sau (đỏ là MinAreaRect và xanh là bounding box):

đo kích thước vật thể
Nguồn: Tại đây

Sau bước này ta đã có đượ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 = Real size / Size in pixel$$

Vậy ta tính tiếp nào:

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

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

Full code của hàm này là:

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

đo kích thước vật thể

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

Done rồi,! Vậy là mình dã guide các bạn dùng OpenCV để đo kích thước các vật thể trong camera đượ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úc các bạn thành công!

Hãy join cùng cộng đồng Mì AI nhé!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube

Cảm ơn bài tham khảo cực hay của tác giả Adrian Rosebrock!

Nguyễn Chiến Thắng

Một người đam mê những điều mới mẻ và công nghệ hiện đại. Uớc mơ cháy bỏng dùng AI, ML để làm cho cuộc sống tốt đẹp hơn! Liên hệ: thangnch@gmail.com hoặc facebook.com/thangnch

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *