Do cấu tạo của tay kẹp mà phần giữa của tay vi kẹp biên của nó không được thẳng. Tuy nhiên do đặc tính của thuật toán xử lý ảnh (sẽ được trình bày dưới đây) ta chỉ quan tâm đến phần dưới của vi kẹp vì vi kẹp chỉ kẹp vật ở phần dưới.
4.1.1.1. Các thuật toán để tìm L
Gọi L là khoảng cách giữa hai mép trong của vi kẹp. Để tìm được L ta phải tìm hai điểm có đánh dấu + trên hai cánh tay của vi kẹp.
Một nhận xét là một ảnh I có kích thước là x,y (x là số dòng ,y là số cột) thì mỗi phần tử của ảnh có thể truy cập tương tự như các phần tử của một ma trận ví dụ như I(x1,y1). Các ảnh chỉ số cụ thể là ảnh chứa biên của vi kẹp ở trên thì các phần tử của ảnh có giá trị là 1 tại các điểm thuộc đường biên của vi kẹp còn các điểm khác (thuộc nền đen) có giá trị là 0.
Như vậy nhìn vào ảnh ở trên ta thấy để tìm được hai điểm có dấu + ta có thể thực hiện phương pháp quét lùi
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
a) Thuật toán quét lùi
Thuật toán quét lùi này tương đối đơn giản. Đầu tiên xuất phát từ điểm có tọa độ là (Xmax,0) tăng dần giá trị của cột từ giá trị 0 đến giá trị cực đại. Sau mỗi lần tăng ta so sánh giá trị của điểm I (Xi,Yj) với 1. Nếu giá trị tại điểm I có giá trị bằng 1 có nghĩa là điểm ảnh đó thuộc đường biên. Ghi nhớ tạo độ điểm này lại và duyệt tiếp. Nếu giá trị tại điểm I đó có giá trị bằng 0 thì tiếp tục tăng giá trị chỉ số cột lên một. Giá trị chỉ số cột tăng đến giá trị cực đại Ymax mà vẫn chưa tìm đủ 4 điểm thuộc đường biên thì ta quay về phía bên trái giảm chỉ số dòng đi 1 đơn vị và lại cho chỉ số cột tăng từ 0 đến giá trị cực đại Ymax. Cứ như thế ta sẽ tìm được một dòng nào đó chứa cả 4 điểm thuộc biên của vi kẹp.
Để ý thấy rằng hai đầu của vi kẹp không cùng nằm trên một đường thẳng nằm ngang mà tay kẹp bên phải cao hơn tay kẹp bên trái. Do đó nếu ta chỉ tìm thấy có hai điểm biên trên một dòng thì có nghĩa là hai điểm biên đó chỉ thuộc một bên của vi kẹp và ta vẫn phải giảm số dòng đi một để tìm trên các dòng khác.
Sau khi tìm được 4 điểm thuộc biên của vi kẹp trên cùng một dòng, tọa độ cột của các điểm đó được giữ bởi một mảng P(1..4) và khoảng cách giữa hai đầu vi kẹp được tính là P(3) – P(2).
Lưu đồ thuật toán như sau:
Hình 4.6 Lưu đồ thuật toán quét lùi
Begin [x,y] = size(ima) i=x k=k+1; P(k)=j; ima(i,j)=1 j=j+1; j<y i=i-1 j=1; k=0;P(1:4)=0 k=4 i>0 L=P(3)- P(2) End T T T F F F T
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Hình 4.7. Các tọa độ cần xác định của ảnh
Với thuật toán trên mục đích cuối cùng của chúng ta là đi tìm 4 điểm nằm trên đường biên. Nếu đường biên trơn tru không „bị vỡ‟ thì ta luôn luôn tìm được 4 điểm trong đó 2 điểm thuộc cánh tay kẹp bên trái và 2 điểm thuộc cánh tay kẹp bên phải. Tuy nhiên nếu gặp trường hợp đường biên không được như ý muốn như hình dưới đây thì thuật toán này sẽ tìm được 4 điểm thuộc biên nhưng chỉ ở một cánh tay của vi kẹp.
Hình 4.8 Ảnh phóng to của một bên kẹp khi đường biên không trơn
Như vậy công thức tính khoảng cách L không còn được đúng nữa. Ở đây không phải là do thuật toán bị sai mà là do chất lượng của ảnh thu được bị bóng hay nhòe, khiến cho việc khắc phục làm trơn ảnh là không thể được
Mặt khác thuật toán này có một nhược điểm là nếu gặp ảnh lớn thì số lần lặp sẽ là lớn dẫn đến việc không đáp ứng được thời gian thực. Có thể cải thiện thuật toán này bằng cách là không phải ở dòng nào ta cũng quét mà ta cho cách n dòng lại quét
một dòng. Như vậy thì số lần lặp sẽ giảm đi n lần, nhưng cũng phạm phải một sai số là n dòng.
Một thuật toán khác được tìm hiểu và đưa ra để cải thiện nhằm giảm bớt số lần lặp dẫn đến giảm thời gian xử lý.
b) Thuật toán quét trái phải
Thuật toán này xuất phát từ nhận xét là sự chuyển động của tay kẹp chỉ trong một phạm vi nhất định vì thế mà các tọa độ đã tìm được trong một lần duyệt sẽ thay đổi rất ít so với vị trí trước. Vì thế mà ta căn cứ vào điểm trước đó để tìm ra điểm hiện tại. Ta xuất phát từ trung điểm của hai điểm đã xác định từ lần trước ta quét về bên trái nếu gặp được biên của vi kẹp thì duyệt tiếp sang bên phải nếu cũng tìm được biên của vi kẹp thì hai điểm đó chính là hai điểm ta cần tìm. Nếu quét sang trái hoặc sang phải mà không tìm thấy biên thì giảm dòng đi 1 đơn vị và tiếp tục quay lại quét. Như vậy thì khoảng cách L sẽ được tính là tọa độ cột của điểm bên phải trừ đi tọa độ cột của điểm bên trái.
4.1.1.2. Kết quả mô phỏng các thuật toán
a) Kết quả khảo sát của thuật toán quét trái phải
Hình dưới đây là kết quả mô phỏng thuật toán quét trái phải. Nhìn vào kết quả khảo sát ta thấy lần khảo sát thứ nhất số lần lặp tương đối là lớn 17494, vì lần đầu tiên ta chưa xác định được hai điểm cần tìm của hai đầu vi kẹp. Sau khi đã tìm được hai điểm đó thì các lần sau ta căn cứ vào hai điểm đó để tìm hai điểm khác khi tay kẹp chuyển động đóng vào hay mở ra và số lần lặp giảm đi đáng kể, chỉ còn 214 lần.
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Kết quả khảo sát trên là sử dụng một ảnh cố định (ảnh g1.jpg) nên khoảng cách của hai đầu vi kẹp là cố định cho các lần khảo sát.
b). Kết quả khảo sát của thuật toán quét lùi
Hình 4.10 Kết quả khảo sát thuật toán quét lùi.
Hình 4.8 là kết quả khảo sát của thuật toán quét lùi. Kết quả khảo sát cũng dùng ảnh g1.jpg như trên. Nhìn vào kết quả ta thấy là số lần lặp lớn hơn rất nhiều so với thuật toán quét trái phải ở trên (35100 so với 107).
Hình 4.11. Ảnh dùng để khảo sát các thuật toán
4.2. Kết quả thực nghiệm
4.2.1. Hoạt động của hệ thống thực nghiệm
Chương trình điều khiển hệ thống được thiết kế dưới dạng giao diện cửa sổ sử dụng GUI builder của phần mềm Matlab nên việc điều khiển tương đối là dễ dàng.
Dưới đây là lưu đồ thuật toán và giao diện của chương trình
Hình 4. 12: Lưu đồ thuật toán điều khiển vi kẹp
4.2.2.1. Giao diện của chương trình
Chương trình điều khiển vi kẹp có tên là control. Sau khi khởi động chương trình điều khiển có giao diện như hình dưới đây
Bắt đầu
Cấu hình cổng COM Cấu hình thiết bị thu nhận ảnh Xác định kích thước của đối tượng
Điều khiển vi kẹp Thu nhận ảnh
Tính khoảng cách giữa hai đầu vi kẹp L
L ≤ d Kết thúc
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Hình 4.13. Giao diện chính của chương trình điều khiển vi kẹp
Trước khi điều khiển ta phải thiết lập cấu hình cho cổng nối tiếp và thiết bị thu ảnh. Để cấu hình cho cổng COM ta chọn Setup\serial (Ctrl + S). Dưới đây là giao diện và cách thức lựa chọn các giá trị cho việc cấu hình.
4.2.2.2. Cấu hình cho cổng Com
Cổng COM được sử dụng để xuất ra các giá trị thập phân từ 0 4095. Giá trị này được đưa qua một bộ biến đổi DA 12 bit. Kết quả sau khi biến đổi DA ta có các giá trị điện áp tương ứng từ 0V – 5V. Để có thể bắt tay được với mạch điều khiển ta cần phải thiết lập cấu hình cho cổng nối tiếp (serial port).
Trên giao diện chính của chương trình điều khiển vi kẹp ta chọn Setup\Serial Ctrl +S. Cửa sổ thiết lập cấu hình cho cổng COM hiện lên như sau:
Hình 4.14. Cấu hình phương thức truyền cho cổng COM Các giá trị cần thiết lập là: Các giá trị cần thiết lập là:
Cổng kết nối (Select serial COM1, COM2, COM3, COM4) thường chọn cổng COM1 Tốc độ truyền (baudrate) (chọn là 9600)
Số bit data trong một khung truyền (chọn là 8) Số bit stop trong một khung truyền (chọn là 1)
Trên hình là các thông số cần lựa chọn để cầu hình. Trước khi cấu hình cho cổng nối tiếp nào đó (Thường là COM1) ta phải thực hiện đóng cổng lại (click vào nút Close all port) để tránh xung đột.
Sau khi lựa chọn tất cả các thông số trong các hộp combobox ta click vào nút setup để thiết lập cấu hình. Để kiểm tra việc kết nối giữa chương trình điều khiển với mạch điều khiển ta có thể kiểm tra bằng cách nhập một giá trị điện áp bất kỳ (0 – 5V) vào ô textbox bên phải rồi click vào nút out(volt). Đo lối ra trên mạch nếu giá trị đo được bằng với giá trị nhập có nghĩa là việc kết nối đã được thực hiện
Có thể kiểm tra bằng một vài giá trị điện áp khác nhau.
4.2.2.3. Cấu hình cho thiết bị thu nhận ảnh
Một thiết bị thu nhận ảnh bất kỳ có các thuộc tính cho phép người dùng có thể thay đổi phù hợp với mục đích sử dụng. Các thuộc tính có thể thay đổi này đã được trình bày trong chương 3 mục thiết bị thu nhận ảnh.
Hình dưới đây là giao diện cho phép lựa chọn các giá trị của các thuộc tính của thiết bị thu nhận ảnh
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Hình 4.15 Cấu hình cho thiết bị thu nhận ảnh
Sau khi nghiên cứu lý thuyết về xử lý ảnh dùng các công cụ sẵn có của Matlab cùng với cấu tạo và nguyên lý hoạt động vi kẹp tôi đã xây dựng lên một hệ điều khiển vi kẹp. Trong phần này tôi xin trình bày về hệ thống thực nghiệm của mình.
Hộp chọn Frames Per Trigger: Hộp chọn cho ta chọn số khung ảnh có thể thu nhận trong một trigger. Giá trị này phụ thuộc vào số khung ta muốn xử lý và phụ thuộc vào tốc độ bắt ảnh của thiết bị thu ảnh. Nếu giá trị này lớn mà tốc độ bắt ảnh của thiết bị không đủ nhanh thì một số khung sẽ bị mờ.
Ví dụ ta có đoạn chương trình sau:
vid=videoinput(„winvideo‟,1,‟YUY2_160x120‟); vid.FramesPerTrigger = 9; triggerconfig(vid,‟manual‟); start(vid); trigger(vid); data=getdata(vid); for i=1:1:9 figure(i); imshow(data(:,:,i)); end
Thực hiện đoạn chương trình trên ta thu được 9 ảnh và hiển thị 9 ảnh thu được lên 9 cửa sổ khác nhau. Quan sát kết quả ta thấy cứ 1 khung rõ sẽ đến hai khung mờ. Và nếu ta lấy ảnh tại vị trí khung mờ (khung thứ 2, 3, 5, 6, 8, 9) ta sẽ không xử lý
được hoặc xử lý sẽ phạm phải những lỗi không mong muốn. (Kết quả khảo sát trên máy ảnh Canon G2 4.0 Mega pixels)
Hình 4.16 Thu 9 ảnh liên tiếp – thực hiện 1 lần trigger
Từ kết quả thực nghiệm và từ yêu cầu thực tế tôi chọn giá trị của tham số này là 1. Nghĩa là bắt một ảnh sau đó xử lý tính toán đưa ra quyết định và tiếp tục bắt ảnh tiếp theo.
Ta thay ví dụ trên bằng ví dụ sau:
vid=videoinput(„winvideo‟,1,‟YUY2_160x120‟); vid.FramesPerTrigger = 1; vid.TriggerrRepeat=9; triggerconfig(vid,‟manual‟); start(vid); for i=1:1:9 trigger(vid); data=getdata(vid); figure(i); imshow(data(:,:,1)); end
Nguyễn Văn Thắng – Luận văn thạc sĩ hệ thống thực nghiệm
Hình 4.17 Thu 9 ảnh liên tiếp – thực hiện 9 lần trigger
Bằng cách lấy một ảnh trong một trigger ta thấy cả 10 khung đều rất rõ nét.
- Hộp chọn Logging Mode: Hộp thoại này lựa chọn mode thu nhận ảnh, hộp này có 3 giá trị là: memory, disk, disk&memory, ba giá trị này tương ứng với các cách thức thu nhận ảnh vào bộ nhớ, vào đĩa cứng hay cả bộ nhớ và đĩa cứng. Nếu ta chỉ thu nhận ảnh để xử lý thì chọn giá trị của hộp này là memory.
- Hộp chọn Trigger Type: Hộp chọn này có hai giá trị là immediate và manual
Chọn immediate thì dòng dữ liệu ảnh có thể thu được ngay khi thiết bị thu nhận ảnh được start
Chọn manual thì dòng dữ liệu ảnh chưa thể được thu được khi thiết bị thu nhận ảnh được start mà sau đó người dùng phải ra lệnh trigger.
- Hộp chọn Trigger Repeat: Hộp chọn này chọn số lần thực hiện trigger sau khi thiết bị thu nhận ảnh được start. Hết số lần trigger thiết bị thu ảnh tự động stop. Muốn thu ảnh tiếp ta phải thực hiện start lại cho thiết bị. Ngược lại số lần trigger chưa hết thì thiết bị không thể start lại trừ khi ta ra lệnh stop cho thiết bị.
- Hộp chọn Supported video formats: Hộp chọn này ban đầu chứa giá trị default. Nếu ta click vào nút lệnh Get formats thì hộp thoại này sẽ chứa các định dạng video mà
thiết bị thu ảnh có thể hỗ trợ. Khi người dùng không thao tác với hộp chọn này thì thiết bị sẽ lấy giá trị định dạng mặc định.
Sau khi lựa chọn hết các thuộc tính cho thiết bị thu ảnh ta click vào nút lệnh Setup để thực hiện thiết lập các giá trị vừa chọn cho thiết bị thu ảnh.
4.2.3. Giao tiếp giữa chương trình và mạch điều khiển vi kẹp
Trong hệ thống điều khiển vi kẹp có một mạch điện tử dùng để nhận lệnh điều khiển từ máy tính. Trong mạch này có một chip điều khiển MPS, chíp này nhận các giá trị số từ máy tính thông qua cổng nối tiếp sau đó điều khiển bộ biến đổi DA, biến đổi các giá trị số thành các giá trị điện áp tương ứng. Cụ thể bộ biến đổi DA là bộ biến đổi số tương tự 12bit, giá trị điện áp mong muốn cực đại là 5V. Giá trị điện áp cực đại là 5V tương ứng với giá trị số biến đổi là 4095 (giá trị cực đại của 12bit).
Tuy nhiên dữ liệu truyền qua cổng nối tiếp chỉ là các dữ liệu 1 byte, nghĩa là giá trị cực đại có thể đưa ra trong một lần truyền là 255. (Giá trị cực đại của 8 bit). Như vậy để có được một giá trị là 12 bit thì giữa bên phát và bên thu phải có sự thống nhất của định dạng dữ liệu truyền/nhận.
Để nhận được một giá trị số có độ lớn 12 bit thì ta phải thực hiện truyền liên tiếp 2 byte. Độ lớn dữ liệu trong khung truyền nối tiếp chọn là 8 bit (Trong hộp chọn data bit của giao diện hình 4.4 chọn là 8) . Trong đó hai bit cao nhất (bit 6,7) được dùng để nhận dạng thứ tự của giá trị truyền, 6 bit còn lại là các bit dữ liệu tương ứng với 6 bit thấp và 6 bit cao của giá trị số 12 bit cần truyền. Nếu giá trị của hai bit cao là 00 thì byte nhận được là byte thấp, và nếu giá trị của hai bit cao nhất là 11 thì byte đó là byte cao. Nếu trong quá trình truyền bị lỗi, hai bit cao nhất của byte dữ liệu bằng 01 hay 10 thì ta không nhận byte đó và phải truyền lại. Sau khi đã nhận được hai byte đúng liên tiếp nhau thì ghép hai byte đó lại thành một dữ liệu 12 bit.
Việc tách một số 12 bit thành hai số 6 bit để truyền được thực hiện như sau: Bên truyền ta chia số 12 bit cho 64 (26=64) phần nguyên sẽ là byte cao và được truyền trước, phần dư là byte thấp và được truyền sau. Bên nhận thực hiện ngược lại, khi nhận được byte cao thì thực hiện nhân với 64 sau đó cộng với byte thấp kết quả cho ra số 12bit.
ví dụ thực hiện truyền số 4000 qua cổng COM
trước tiên ta chia số 4000 thành hai phần như đã trình bày ở trên 4000 = 62*64+ 32