Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (995.15 KB, 26 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>Đánh giá của giảng viên hướng dẫn</b>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3"><b> Kết quả đánh giá Hà Nội, ngày 31 tháng 7 năm 2023</b>
Giảng viên hướng dẫn
Nguyễn Văn Đức
Đặng Đức Độ
Nguyễn Bá Công
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"><b>CHƯƠNG 1. LỜI NÓI ĐẦU...6</b>
<b>CHƯƠNG 2. TỔNG QUAN VỀ ĐỀ TÀI...7</b>
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
<b>CHƯƠNG 3. NỘI DUNG CÁC BƯỚC THỰC HIỆN...11</b>
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 tốn Canny...14
3.5 Sử dụng thuật tố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
<b>CHƯƠNG 4. KẾT LUẬN...24</b>
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6"><b>CHƯƠNG 1. LỜI NÓI ĐẦU</b>
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ết cá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 tốn và xử lí kết quả hồn tồ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ện tử-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ơng tin, 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 q trình sản xuất hay các robot thông minh, với những khả năng vượt trộ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ích thước vật thể, với vật thể tham chiếu được chọn là đồng xu. Đề tài sử dụng thuật toán Canny và thư viện Opencv.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7"><b>CHƯƠNG 2. TỔNG QUAN VỀ ĐỀ TÀI2.1 Đề tài trong công nghiệp thực tế</b>
Sản phẩm sau khi được lắp ráp hay gia công đều cần được kiểm ngoại dạng trước khi chuyển sang công đoạn tiếp theo để đảm bảo không để lọt bất cứ sản phẩ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ểm tra 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ình nhất định. Việc này có nhiều ưu điểm song lại khơng đạt được độ chính xác cao nhấ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 được thự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ười thự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ó độ tin cậ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 tra kí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ơng tiếp xúc dùng camera giúp xác định chính xác (cỡ dưới 10µm và bằng 10% dung sai 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ân cơ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
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">dụ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ước của một số vật đơn giản.
<b>2.2 Cơ sở lý thuyết cách đo kích thước vật thể bằng OpenCV thuần</b>
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:
Với một cách đơn giản hơn, ta sẽ hiểu như sau:
<b>Đầ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 “.</b>
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 tốn. Giả sử viên bi có đường kính thật <i><small>D</small><sub>r</sub></i><small>=2 cm=20 mm</small>.
<b>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</b>
thước và chụp một tấm.
<b>Sau đó, Giả sử ta đo được đường kính trong ảnh của Vật thamchiếu là </b><i><small>D</small><sub>c</sub></i><small>=100 pixel</small><b>, ta suy ra kích thước thật của 1-pixel là 20/100 =0.2mm (goi là số P)</b>
<b>Bước cuối cung, ta đo kích thước trong ảnh Vật muốn đo bằng pixel, sau đó</b>
nhân với P là sẽ ra kích thước thật của vật.
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"><b>2.3 Phương án và các thức thực hiện</b>
Đ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 so vớ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 tố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ích thước, tính ra kích thước đồng xu theo tỉ lệ trên pixel. (Cách này cần mẫu vậ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ước mộ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ệ theo pixel đã quy đổi ra mm.
Các bước thực hiện:
Có thể chia q trình làm 5 bước chính như sau:
<i>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á</i>
cố định để đảm bảo hình ảnh vật mẫu và đồng xu cùng nằm trên một mặt phẳng FOV.
<i>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</i>
tiền xử lý. Ở bước này ta sẽ dùng các hàm trong để đọc ảnh và điều chỉnh kích thước của ảnh. Sau đó ta chuẩn bị cho thuật tốn Canny bằng cách chuyển sang ảnh xám và sử dụng bộ lọc Gauss để lọc nhiễu.
<i>Bước 3 (Đo kích thước của vật):</i>
<i>(tìm đường bao): tìm cạnh của vật bằng thuật tốn Canny và xử lí</i>
đường bao bằng cách loại bỏ các đường viền nhỏ. Sau đó tính diện tích của vật bằng định lý green.
<i>(đo kích thước): sau khi tìm được các contour ta thực hiện tính tốn</i>
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ất của contour. Ta tính tốn được chiều dài 2 cạnh theo pixel nhờ vào
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">cá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ật bên ngồi
<i>Bước 4 (Xuất ảnh): Ảnh đã vẽ hình bao và ghi kích thước của đồng xu và</i>
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.
<b>CHƯƠNG 3. NỘI DUNG CÁC BƯỚC THỰC HIỆN3.1 Lấy ảnh</b>
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><b>3.1.1 Phương án sử dụng camera điện thoại </b>
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óc chụ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.
<i>Hình 2.1 Cơ cấu chụp ảnh vật</i>
Hệ khung trên giúp cho mặt phẳng của camera ln song song với mặt phẳng đặt vật. Ngồi ra, bên dưới mặt phẳng đặt vật có đèn led giúp loại bỏ bóng củ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ơn trong khi xử lý ảnh.
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12"><i>Hình 2.2 Hình ảnh của vật cần đo</i>
<b>3.1.2 Phương án xây dựng hệ đo realtime</b>
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ện thoạ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ệ:
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13"><b>3.2 Tiền xử lý</b>
Khi có được các ảnh, trước hết ta lấy dữ liệu ảnh và thực hiện bước tiền xử lý. Tất cả phần này được viết trong hàm:
<i><small>image,edged = read_and_preprocess(filename, canny_low=50,canny_high=100, blur_kernel=9, close_kernel=3)</small></i>
với dữ liệu đầu vào gồm tên tệp ảnh (filename), ngưỡng thấp và cao của thuật toán Canny (canny_low, canny_high), kích thước ma trận vng cho nhân của thuật tốn làm mờ Gauss (blur_kernel), kích thước ma trận vng cho nhân của thuật tốn hình thái học Closing (close_kernel). Đầu ra của hàm này là một ảnh đọc từ tệp và một ảnh chứa cạnh của vật thể cùng nhiễu thông cao.0
<b>3.3 Đọc ảnh</b>
Nội dung hàm bắt đầu với hàm:
<i><small>image = cv2.imread(filename, flag=none)</small></i>
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 đầu tiê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 ta cầ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:
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><i><small>image = cv2.resize(src, dsize)</small></i>
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 tốn từ kích thước ảnh gốc, lấy được bằng đặc tính củ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ích thước lớn nhất của ảnh nhỏ hơn 1000, sau đó chuyển kích thước về số ngun. Bước tính tốn trên dưới dạng ngơn ngữ lập trình sẽ như sau:
<i><small>siz1, siz2 = image. shape [0:2]while max (siz1, siz2) > 1000:</small></i>
<i><small>siz1 = siz1/1.5siz2 = siz2/1.5siz1 = int(siz1)siz2 = int(siz2)</small></i>
<i><small>image = cv2.resize(image, (siz2, siz1))</small></i>
<b>3.4 Chuẩn bị cho thuật toán Canny</b>
Sau khi ảnh gốc đã đạt kích thước phù hợp, muốn thực hiện thuật tốn tìm cạnh Canny, ta cần chuyển ảnh sang ảnh xám để xử lý 1 kênh màu, làm mờ ảnh với mặ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ạng quá nhiều. Ta chuyển ảnh sang ảnh xám với hàm:
<i><small>gray = cv2.cvtColor(src, code)</small></i>
trong thư viện cv2. Src là ảnh gốc (image), code là gọi hàm chuyển đổi không gian màu (cv2.COLOR_BGR2GRAY). Hàm này lấy giá trị trung bình của 3 kênh màu tại mỗi pixel, ta sẽ thu được ảnh 1 kênh màu (ảnh xám) ở đầu ra. Sau đó, ta sử dụng hàm:
<i><small>blur = cv2.GaussianBlur(src, ksize, sigmaX)</small></i>
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ẩn Gauss theo trục x (để bằng 0, vì đã chọn ksize nên không cần). Hàm này sử dụng mặ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ờ.
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15"><b>3.5 Sử dụng thuật toán Canny</b>
Tiếp theo, ta sử dụng thuật tốn Canny để tìm cạnh với hàm:
<i><small>edged = cv2.Canny(image, threshold1, threshold2)</small></i>
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ện tích chập ảnh với mặt nạ Sobel để tìm các vector vng 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 ra thà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ạng như sau:
Trong đó, A là ma trận dữ liệu ảnh, (G<small>x</small>, Gy) là vector hướng G tại từng điểm. Vector G có hướng ln vng góc với các đường cạnh trong ảnh (ranh giới nơi cường độ sáng có bước nhảy), có độ dài tỉ lệ với độ chênh lệch cường độ sáng vớ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 Closing gồm 2 hàm:
<i><small>edged = cv2.dilate(src, kernel)edged = cv2.erode(src, kernel)</small></i>
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)).
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">Dilate 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ị 255 khi 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àu trắ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ích thước ban đầu. Như vậy là đã kết thúc bước tiền xử lý.
<b>3.6 Đo kích thước của vật3.6.1 Tìm đường bao vật thể</b>
Sau bước tiền xử lý – sử dụng thuật tố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ền mong 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):
<i><small>cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)</small></i>
Ở đâ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ụng hàm imutils.grab_contours()) trong python để xử lý các đường viền này :
<i><b><small>cnts = imutils.grab_contours(cnts)</small></b></i>
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)
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">Tiếp theo ta tiến hành sắp xếp các đường viền theo thứ tự từ trái qua phải trên dữ liệu vừa nhận được qua hàm:
<i><b><small>(cnts, _) = contours.sort_contours(cnts)</small></b></i>
Ta loải bỏ các đường viền nhỏ (không cần thiết) trên ảnh mà ta thu được thơng qua việc so sánh diện tích của các đường bao (sử dụng hàm <small>contourArea()</small>
để tìm diện tích của các đường bao) với một số xác định đã được cho trước:
<i><small>if cv2.contourArea(c) < area_threshold : continue</small></i>
Ở đây c chính là tập hợp các tọa độ pixel thuộc cùng một đường bao đã xác định ở trên, area_threshold là giá trị giới hạn diện tích theo pixel mà nếu nhỏ hơn ta sẽ loại bỏ. Từ đầu vào của thuật toán contourArea( ) là tập hợp tọa độ các pixel thuộc cùng một đường bao, ta sẽ vẽ được dạng của đường bao. Sau đó áp dụng định lý Green ta sẽ tính được diện tích của đường bao theo đơn vị là pixel
Ở đây ta có cơng thức diện tích theo định lý Green:
<b>3.6.2 Diện tích hình chữ nhật tối thiểu bao quanh Contour</b>
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 đỏ.
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><i>Hình: Box chữ nhật bao quanh contour</i>
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ấu trúc Box2D chứa các chi tiết sau – (tâm (x, y), (chiều rộng, chiều cao), góc quay). Cú pháp được đưa ra dưới đây:
<i><b>(Center (x, y), (width, height), angle of rotation) = cv2.minAreaRect(points)</b></i>
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ức nă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ó y cao nhất. Cú pháp được đưa ra dưới đây:
<i><b>points = cv2.boxPoints(box)</b></i>
<b>3.6.3 Góc quay của hình chữ nhật tối thiểu </b>
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ất thì điểm ngồ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).
</div>