Khi sản xuất hàng loạt, sản phẩm rất nhiều & nhỏ, khiến cho việc kiểm trakích thước sản phẩm bằng con người trở nên hết sức khó khăn và tốn kém vì vậy, sự tiến bộ của kĩ thuật và công ng
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
TRƯỜNG CƠ KHÍ
Khoa Cơ điện tử
***************
XỬ LÝ ẢNH
Đo kích thước vật thể realtime
Đánh giá của giảng viên hướng dẫn
………
………
………
………
Giảng viên hướng dẫn: TS Dương Văn Lạc
HÀ NỘI, 7/2023
Trang 2………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 3
Kết quả đánh giá Hà Nội, ngày 31 tháng 7 năm 2023
Giảng viên hướng dẫn
Nguyễn Văn Đức
Đặng Đức Độ
Nguyễn Bá Công
Trang 4MỤC LỤC
CHƯƠNG 1 LỜI NÓI ĐẦU 6
CHƯƠNG 2 TỔNG QUAN VỀ ĐỀ TÀI 7
2.1 Đề tài trong công nghiệp thực tế 7
2.2 Cơ sở lý thuyết cách đo kích thước vật thể bằng OpenCV thuần 8
2.3 Phương án và các thức thực hiện 9
CHƯƠNG 3 NỘI DUNG CÁC BƯỚC THỰC HIỆN 11
3.1 Lấy ảnh 11
3.1.1 Phương án sử dụng camera điện thoại 11
3.1.2 Phương án xây dựng hệ đo realtime 12
3.2 Tiền xử lý 13
3.3 Đọc ảnh 13
3.4 Chuẩn bị cho thuật toán Canny 14
3.5 Sử dụng thuật toán Canny 15
3.6 Đo kích thước của vật 16
3.6.1 Tìm đường bao vật thể 16
3.6.2 Diện tích hình chữ nhật tối thiểu bao quanh Contour 17
3.6.3 Góc quay của hình chữ nhật tối thiểu 18
3.6.4 Đo kích thước đường bao theo pixel 20
3.6.5 Đo kích thước đường bao theo millimet 22
3.7 Xuất ảnh 22
3.8 Realtime video 23
CHƯƠNG 4 KẾT LUẬN 24
Trang 54.1 Nhận xét và đánh giá 24
4.2 Kết quả đạt được 24
4.3 Những vấn đề khó khăn, chưa giải quyết được 25
4.4 Hướng phát triển 25
CHƯƠNG 5 TÀI LIỆU THAM KHẢO 26
Trang 6CHƯƠNG 1 LỜI NÓI ĐẦU
Hiện nay, xử lý ảnh là một lĩnh vực đang được quan tâm rất nhiều Tại hầu hếtcác nước có nền khoa học tiên tiến trên thế giới, các loại trang thiết bị máy móc,sản phẩm thông minh được ứng dụng hầu hết vào mọi lĩnh vực
Trước đây, người ta thường chỉ sử dụng các thiết bị đo mà việc tính toán và xử líkết quả hoàn toàn là thủ công Do những yêu cầu cấp thiết trong sản xuất chế tạo
mà đo lường ngày càng phát triển Giờ đây với sự tiến bộ của các ngành cơ-điệntử-tin học và việc ứng dụng những thành tựu của kỹ thuật điện tử, công nghệ thôngtin, trí tuệ nhân tạo, vào ngành cơ khí thì xử lí ảnh và đo lường trong các hệ thống
và robot công nghiệp đã được ứng dụng ngày càng rộng rãi Nó là công cụ đểkiểm tra đánh giá chất lượng của sản phẩm, nó làm tai mắt cho các hệ thống tựđộng hóa quá trình sản xuất hay các robot thông minh, với những khả năng vượttrội so với các phương pháp truyển thống như:
Khả năng tự xử lí và lưu trữ kết quả đo
Thực hiện công việc đo theo chương trình
Tự động thu thập, phân loại và báo lỗi, …
Và trong lần này, nhóm chúng em làm với một đề tài nhỏ đó là đo kíchthước vật thể, với vật thể tham chiếu được chọn là đồng xu Đề tài sử dụng thuậttoán Canny và thư viện Opencv
Trang 7CHƯƠNG 2 TỔNG QUAN VỀ ĐỀ TÀI
2.1 Đề tài trong công nghiệp thực tế
Sản phẩm sau khi được lắp ráp hay gia công đều cần được kiểm ngoại dạngtrước khi chuyển sang công đoạn tiếp theo để đảm bảo không để lọt bất cứ sảnphẩm lỗi hay kém chất lượng nào tới khách hàng Thông thường công đoạn kiểmtra này do người thao tác (công nhân) trực tiếp dùng mắt kiểm tra với 1 quy trìnhnhất định Việc này có nhiều ưu điểm song lại không đạt được độ chính xác caonhất mà nhà sản xuất mong muốn
Từ những vấn đề đó, xử lý ảnh trong công nghiệp hiện nay phát triển có nhiềuứng dụng có thể kể đến như:
Nhận diện/kiểm tra ngoại dạng sản phẩm
Nhận diện/kiểm tra màu sắc
Đo lường/kiểm tra kích thước không tiếp xúc
Kiểm tra kí tự quang học (OCV)
Kiểm tra mã vạch
Điều hướng Robot
…
Trong những ứng dụng trên, nhóm chúng em sẽ tập trung vào ứng dụng thứ
3 đó là đo lường và kiểm tra kích thước của vật Các phép đo truyền thống đượcthực hiện với các dụng cụ đo bằng cơ (đã được hiệu chỉnh rất chính xác) và ngườithực hiện đo phải được huấn luyện về kĩ thuật đo mới đảm bảo kết quả đo có độ tincậy cao Khi sản xuất hàng loạt, sản phẩm rất nhiều & nhỏ, khiến cho việc kiểm trakích thước sản phẩm bằng con người trở nên hết sức khó khăn và tốn kém vì vậy,
sự tiến bộ của kĩ thuật và công nghệ cung cấp giải pháp đo kiểm kích thước khôngtiếp xúc dùng camera giúp xác định chính xác (cỡ dưới 10µm và bằng 10% dungsai kích thước bản vẽ) với tốc độ cao các: khoảng cách, góc, diện tích, độ khớpđường, độ khớp tròn … Từ đó nhà máy sẽ tiết kiệm được rất nhiều chi phí nhâncông, giảm được tối đa sai sót so với phương pháp đo kiểm truyền thống Ứng
Trang 8dụng này được xử dụng trong công nghiệp rất nhiều với nhiều những hình dạng vàkích thước khác nhau Và trong lần này chúng em sẽ làm với đề tài đo kích thướccủa một số vật đơn giản.
2.2 Cơ sở lý thuyết cách đo kích thước vật thể bằng OpenCV thuần
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ấtphức tạp như hình dưới:
Với một cách đơn giản hơn, ta sẽ hiểu như sau:
Đầ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 trongviệc tính toán Giả sử viên bi có đường kính thật D r=2 cm=20 mm
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à D c=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
Trang 92.3 Phương án và các thức thực hiện
Đo kích thước đồng xu qua xử lý ảnh có 2 cách chính:
Đo khoảng cách từ camera đến nơi đặt đồng xu, góc nghiêng của camera sovới mặt phẳng chứa đồng xu, kết hợp với các thông tin về tiêu cự, vùng nhìn(FOV) và góc nhìn (AOV) để tính toán ra được diện tích đồng xu
Nếu không sử dụng camera thì ta sẽ sử dụng mẫu chuẩn biết trước kíchthước, tính ra kích thước đồng xu theo tỉ lệ trên pixel (Cách này cần mẫuvật và đồng xu cùng nằm trong mặt phẳng FOV)
Nhóm sử dụng cách 2 để đo kích thước đồng xu
Sau khi đo kích thước đồng xu làm vật tham chiếu, nhóm sẽ đo được kích thướcmột số vật khác khi đặt vào cùng vị trí khung hình với lúc trước để nhân tỉ lệ theopixel đã quy đổi ra mm
Các bước thực hiện:
Có thể chia quá trình làm 5 bước chính như sau:
Bước 1 (Lấy ảnh): Thêm hình ảnh bằng cách sử dụng điện thoại đặt trên giá
cố định để đảm bảo hình ảnh vật mẫu và đồng xu cùng nằm trên một mặtphẳng FOV
Bước 2 (Tiền xử lý): Ta lấy dữ liệu ảnh đã thu được và thực hiện các bước
tiền xử lý Ở bước này ta sẽ dùng các hàm trong để đọc ảnh và điều chỉnhkích thước của ảnh Sau đó ta chuẩn bị cho thuật toán Canny bằng cáchchuyển sang ảnh xám và sử dụng bộ lọc Gauss để lọc nhiễu
Bước 3 (Đo kích thước của vật):
(tìm đường bao): tìm cạnh của vật bằng thuật toán Canny và xử lí
đường bao bằng cách loại bỏ các đường viền nhỏ Sau đó tính diệntích của vật bằng định lý green
(đo kích thước): sau khi tìm được các contour ta thực hiện tính toán
kích thước của nó bằng cách tìm hình chữ nhật có diện tích bé nhấtcủa contour Ta tính toán được chiều dài 2 cạnh theo pixel nhờ vào
Trang 10các hàm trong thư viện OpenCV Và cuối cùng ta tiến hành xử lý giátrị chiều dài 2 cạnh theo pixel có ở trên để tìm được kích thước thậtbên ngoài
Bước 4 (Xuất ảnh): Ảnh đã vẽ hình bao và ghi kích thước của đồng xu và
vật mẫu Hoặc ở chế độ realtime, video xuất ra sẽ quay trực tiếp vật được đo
và ghi kích thước đo được lên khung hình camera
CHƯƠNG 3 NỘI DUNG CÁC BƯỚC THỰC HIỆN 3.1 Lấy ảnh
Trang 113.1.1 Phương án sử dụng camera điện thoại
Nhóm sử dụng camera điện thoại để chụp được hình ảnh của vật cần đo Để
đo được chính xác kích thước của vật, ta cần đảm bảo cố định hai yếu tố là gócchụp của camera và khoảng cách từ camera tới vật Do đó, điện thoại được gá cốđịnh trên một hệ khung như hình
Hình 2.1 Cơ cấu chụp ảnh vật
Hệ khung trên giúp cho mặt phẳng của camera luôn song song với mặtphẳng đặt vật Ngoài ra, bên dưới mặt phẳng đặt vật có đèn led giúp loại bỏ bóngcủa vật in xuống mặt phẳng, việc này giúp tạo ra các bức ảnh rõ nét và dễ dàng hơntrong khi xử lý ảnh
Trang 12Hình 2.2 Hình ảnh của vật cần đo
3.1.2 Phương án xây dựng hệ đo realtime
Nhóm sử dụng các tấm fomex để làm thành hộp kín, có ánh sáng từ đèn điệnthoại, sau đó có chỗ để camera khác để thu hình ảnh vật đo đặt dưới đáy hộp
Sau đây là hình ảnh thu được từ hệ:
Trang 133.3 Đọc ảnh
Nội dung hàm bắt đầu với hàm:
image = cv2.imread(filename, flag=none)
trong thư viện cv2 Trong đó, flag là cờ chuyển đổi kiểu dữ liệu ảnh Hàm này sẽđọc từng điểm ảnh ở 3 kênh màu RGB, cho ra một mảng 3 chiều với 2 chiều đầutiên là kích thước ảnh, chiều thứ 3 là 3 kênh màu Ở đây, ta bỏ qua flag để thuđược ảnh gốc Do ảnh có độ phân giải cao, khi lấy dữ liệu sẽ cho ra ảnh lớn, nên tacần giảm kích thước ảnh mà không để ảnh sai tỉ lệ kích thước Ta sẽ sử dụng hàm:
Trang 14image = cv2.resize(src, dsize)
trong thư viện cv2 Src là ảnh gốc (image), dsize là kích thước mới của ảnh (siz1,siz2) Kích thước mới được tính toán từ kích thước ảnh gốc, lấy được bằng đặc tínhcủa đối tượng ma trận - shape Ta lấy kích thước ảnh gốc chia 1.5 cho đến khi kíchthước lớn nhất của ảnh nhỏ hơn 1000, sau đó chuyển kích thước về số nguyên.Bước tính toán trên dưới dạng ngôn ngữ lập trình sẽ như sau:
siz1, siz2 = image shape [0:2]
while max (siz1, siz2) > 1000:
siz1 = siz1/1.5 siz2 = siz2/1.5 siz1 = int(siz1) siz2 = int(siz2) image = cv2.resize(image, (siz2, siz1))
3.4 Chuẩn bị cho thuật toán Canny
Sau khi ảnh gốc đã đạt kích thước phù hợp, muốn thực hiện thuật toán tìmcạnh Canny, ta cần chuyển ảnh sang ảnh xám để xử lý 1 kênh màu, làm mờ ảnh vớimặt nạ Gauss để xử lý nhiễu thông thấp mà cạnh của vật thể không bị biến dạngquá nhiều Ta chuyển ảnh sang ảnh xám với hàm:
gray = cv2.cvtColor(src, code)
trong thư viện cv2 Src là ảnh gốc (image), code là gọi hàm chuyển đổi không gianmàu (cv2.COLOR_BGR2GRAY) Hàm này lấy giá trị trung bình của 3 kênh màu tạimỗi pixel, ta sẽ thu được ảnh 1 kênh màu (ảnh xám) ở đầu ra Sau đó, ta sử dụnghàm:
blur = cv2.GaussianBlur(src, ksize, sigmaX)
trong thư viện cv2 Với src là ảnh gốc (gray), ksize là kích thước mặt nạ Gauss(blur_kernel, blur_kernel), sigmaX là hệ số trong đồ thị phân bố xác suất chuẩnGauss theo trục x (để bằng 0, vì đã chọn ksize nên không cần) Hàm này sử dụngmặt nạ phân bố chuẩn Gauss, thực hiện tích chập với ảnh gốc Đầu ra của hàm này
là ảnh được làm mờ
Trang 153.5 Sử dụng thuật toán Canny
Tiếp theo, ta sử dụng thuật toán Canny để tìm cạnh với hàm:
edged = cv2.Canny(image, threshold1, threshold2)
trong thư viện cv2 Image là ảnh gốc (blur), threshold1 là ngưỡng thấp(canny_low), threshold2 là ngưỡng cao (canny_high) Thuật toán Canny thực hiệntích chập ảnh với mặt nạ Sobel để tìm các vector vuông góc với cạnh, loại bỏ cácđiểm không phải cực đại địa phương (đưa về 0), sau đó dùng ngưỡng để chọn rathành phần cạnh và không phải cạnh Cụ thể, tích chập với ma trận Sobel có dạngnhư sau:
Trong đó, A là ma trận dữ liệu ảnh, (Gx, Gy) là vector hướng G tại từngđiểm Vector G có hướng luôn vuông góc với các đường cạnh trong ảnh (ranh giớinơi cường độ sáng có bước nhảy), có độ dài tỉ lệ với độ chênh lệch cường độ sángvới các điểm ảnh lân cận Từ giá trị độ dài của G, ta lọc cơ sở bằng cách giữ lại cácđiểm là cực đại so với 2 điểm lân cận (xét trên 4 phương), các điểm khác đưa vềgiá trị 0
Khi có được các điểm ảnh có khả năng là cạnh, ta áp đặt ngưỡng cao vàngưỡng thấp để giữ lại các cạnh đủ lớn Các điểm ảnh có (|G| > ngưỡng cao) hoặc(|G| > ngưỡng thấp và nằm cạnh điểm ảnh có |G| > ngưỡng cao) sẽ được giữ lại.Đầu ra của hàm là ảnh nền đen cạnh trắng
Để đề phòng trường hợp cạnh bị đứt đoạn nhỏ, ta sử dụng thuật toán Closinggồm 2 hàm:
edged = cv2.dilate(src, kernel) edged = cv2.erode(src, kernel)
trong thư viện cv2 Src là ảnh gốc (edged), kernel là ma trận dùng tích chập vớiảnh (có thể chỉ cần đưa vào kích thước (close_kernel, close_kernel))
Trang 16Dilate và erode sẽ tích chập mặt nạ với ảnh, dilate đặt điểm mốc giá trị 255 khi vàchỉ khi ít nhất một điểm qua mặt nạ khác 0, còn erode thì đặt điểm mốc giá trị 255khi và chỉ khi tất cả điểm qua mặt nạ đều khác 0 Kết quả là dilate làm phần màutrắng giãn ra, cạnh bị đứt sẽ được nối liền, erode làm phần màu trắng co lại kíchthước ban đầu Như vậy là đã kết thúc bước tiền xử lý.
3.6 Đo kích thước của vật
3.6.1 Tìm đường bao vật thể
Sau bước tiền xử lý – sử dụng thuật toán Canny detection để tìm ra cạnh,đường viền của bức ảnh ta sử dụng thuật toán FindContour để tìm đường viềnmong muốn dưới dạng là chuỗi tọa độ các điểm trên đường viền (bao gồm tất cảcác đường viền và cạnh bao):
cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_A PPROX_SIMPLE)
Ở đây ta điền 3 tham số:
Detection, như trong code là ảnh copy từ ảnh edge đã được xử lý ở trên
bên ngoài, loại bỏ các đường viền bên trong
viền không kín
Kết quả chúng ta sẽ được tập hợp các tọa độ thuộc các đường bao
Sau đó ta tiến hành đưa các chuỗi tìm được về dạng dữ liệu Tuple (sử dụnghàm imutils.grab_contours()) trong python để xử lý các đường viền này :
cnts = imutils.grab_contours(cnts)
Tham số đưa vào là ‘cnts’ đây là kết quả lấy được từ hàm findcontour,qua hàm trên sẽ chuyển tạp hợp các tọa độ về dạng dữ liệu Tuple (nhóm các tạo độcùng thuộc 1 đường bao)
Trang 17Tiếp theo ta tiến hành sắp xếp các đường viền theo thứ tự từ trái qua phảitrên dữ liệu vừa nhận được qua hàm:
Ở đây ta có công thức diện tích theo định lý Green:
3.6.2 Diện tích hình chữ nhật tối thiểu bao quanh Contour
Hình ảnh bên dưới hiển thị 2 hình chữ nhật, hình chữ nhật màu xanh lá cây
là hình chữ nhật bao quanh bình thường trong khi hình màu đỏ là hình chữ nhật códiện tích tối thiểu Xem cách xoay hình chữ nhật màu đỏ
Trang 18Hình: Box chữ nhật bao quanh contour
OpenCV cung cấp một hàm cv2.minAreaRect() để tìm diện tích nhỏ nhấtđược xoay hình chữ nhật Điều này lấy đầu vào là tập hợp điểm 2D và trả về cấutrúc Box2D chứa các chi tiết sau – (tâm (x, y), (chiều rộng, chiều cao), gócquay) Cú pháp được đưa ra dưới đây:
(Center (x, y), (width, height), angle of rotation) = cv2.minAreaRect(points)
Nhưng để vẽ một hình chữ nhật, chúng ta cần 4 góc của hình chữ nhật Vìvậy, để chuyển cấu trúc Box2D thành 4 điểm góc, OpenCV cung cấp một chứcnăng khác là cv2.boxPoints() Cái này lấy cấu trúc Box2D làm đầu vào và trả về 4điểm góc 4 điểm góc được sắp xếp theo chiều kim đồng hồ bắt đầu từ điểm có ycao nhất Cú pháp được đưa ra dưới đây:
points = cv2.boxPoints(box)
3.6.3 Góc quay của hình chữ nhật tối thiểu
Như chúng ta đã biết rằng 4 điểm góc được sắp xếp theo chiều kim đồng hồbắt đầu từ điểm có y cao nhất như hình bên dưới Nếu 2 điểm có cùng y cao nhấtthì điểm ngoài cùng bên phải là điểm xuất phát Các điểm được đánh số là 0,1,2,3(0-bắt đầu, 3-kết thúc)
Trang 19Vì vậy, góc quay được cung cấp bởi cv2.minAreaRect() của OpenCV thực
sự là góc giữa đường thẳng (nối điểm đầu và điểm cuối) và phương nằm ngangnhư minh họa bên dưới:
Do đó, giá trị góc luôn nằm trong khoảng [-90,0) Tại sao? bởi vì nếu vật thể
bị xoay hơn 90 độ, thì cạnh tiếp theo được sử dụng để tính góc so với phươngngang Và do đó, góc được tính toán luôn nằm trong khoảng [-90,0) Xem hình ảnhbên dưới trong đó đường màu xanh lá cây hiển thị đường nối điểm đầu và điểmcuối được sử dụng để tính góc Ngoài ra, hãy xem điểm bắt đầu và điểm cuối thayđổi như thế nào khi xoay đối tượng Các điểm được đánh số là 0,1,2,3 (0-bắt đầu,3-kết thúc)