3.1.1. Công cụ thu nhận ảnh là gì?
Công cụ thu nhận ảnh là một tập hợp các hàm hỗ trợ một phạm vi rộng trong việc thu nhận ảnh, bao gồm thu nhận các ảnh thông qua nhiều loại thiết bị thu nhận ảnh từ các thiết bị chuyên dụng đến các thiết bị đơn giản là các webcam.
Nhiều hàm chức năng trong công cụ là các hàm M-file của Matlab. Ta có thể xem mã của các hàm đó thông qua câu lệnh type của Matlab.
Cú pháp: type „tên hàm‟
Công cụ xử lý ảnh sử dụng các thành phần gọi là bộ điều hợp thiết bị phần cứng để kết nối với các thiết bị thông qua các bộ điều khiển của chúng. Các bộ điều hợp hỗ trợ cho các thiết bị của nhiều nhà cung cấp
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
Hình 3.1. Các thành phần của công cụ xử lý ảnh.
3.1.2. Các bước cơ bản để thu nhận ảnh (Image Acquisition Toolbox)
Các bước để thu nhận ảnh bằng công cụ thu nhận ảnh của MATLAB: Bước 1 Cài đặt và cẩu hình cho thiết bị thu nhận ảnh Bước 2 Lầy thông tin về phần cứng
Bước 3 Tạo một đối tượng lối vào video
Bước 4 Xem dòng tín hiệu video lối vào (tùy chọn)
Bước 5 Cấu hình các thuộc tính cho đối tượng ảnh thu nhận (Tùy chọn) Bước 6 Thu nhận dữ liệu ảnh
Bước 7 Xóa bỏ các dữ liệu ảnh trong bộ nhớ
Bước 1: Cài đặt thiết bị thu nhận ảnh
Để có thể thu nhận được ảnh khi cắm các thiết bị thu nhận ảnh vào máy tính qua các cổng vào ra (thường là cổng USB) thì ta phải cài đặt các phần mềm điều khiển các thiết bị đó. Các phần mềm này thường được nhà cung cấp đưa đi kèm với các
thiết bị.
Bước 2: Lấy thông tin về phần cứng
Trong bước này ta phải thu nhận lấy các thông tin về phần cứng trước khi tạo ra một đối tượng ảnh.
Bảng thông tin dưới đây liệt kê các thông tin liên quan đến phần cứng của thiết bị thu nhận ảnh. Sử dụng hàm imaqhwinfo của Matlab để thu nhận thông tin từng mục
Adaptor name
Adaptor là một phần mềm Matlab sử dụng để giao tiêp với thiết bị thu nhận ảnh thông qua bộ phận điều khiển của thiết bị (Driver). Toolboxs xử lý ảnh trong Matlab có sẵn một số adaptor của các nhà cung cấp thiết bị thu nhận ảnh chính và một vài các thiết bị thu nhận ảnh riêng.
Device ID
ID thiết bị là một con số mà adptor đã gán duy nhất cho mỗi thiết bị thu nhận ảnh mà chúng có thể giao tiếp được
Chú ý: Nếu một thiết bị có ID tùy chọn thì toolbox sử dụng ID đầu tiên có thể làm giá trị mặc định.
Video format
Định dạng hình ảnh là chỉ ra độ phân giải cụ thể cho một tín hiệu ảnh (Bề rộng, chiều cao)
Một thiết bị thu nhận ảnh thường hỗ trợ nhiều định dạng khác nhau đề tùy lựa chọn cho người dùng.
Chú ý: Nếu định dạng của thiết bị là tùy ý hay không có thì toolbox sử dụng một trong các định dạng được hỗ trợ làm giá trị mặc định
+ Adaptor Name – Tên của Adaptor
Để biết tên của một adaptor, trong Matlab dùng câu lệnh imaqhwinfo và không có tham số như dưới đây:
imaqhwinfo ans =
InstalledAdaptors: {'matrox' 'winvideo'} MATLABVersion: '7.0 (R14)'
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
ToolboxVersion: '1.5 (R14)'
Trong kết quả trả về của câu lệnh imaqhwinfo trong trường InstalledAdaptors liệt kê tất cả các adaptor hiện có trên máy tính. Trong ví dụ trên imaqhwinfo tìm thấy hai adaptor trong máy tính là „matrox‟ và „winvideo‟. Tuy nhiên một máy tính có thể có nhiều hơn hai hoặc chỉ có một adaptor, lựa chọn tên của adaptor để truy cập vào thiết bị thu nhận ảnh.
+ Device ID
Để tìm ID của từng thiết bị thu nhận ảnh, dùng câu lệnh imaqhwinfo với tham số duy nhất là tên của một adaptor.(tên của adaptor được tìm thấy ở phần Adaptor Name info = imaqhwinfo('winvideo') info = AdaptorDllName: [1x73 char] AdaptorDllVersion: '1.5 (R14)' AdaptorName: 'matrox' DeviceIDs: {[1]} DeviceInfo: [1x1 struct]
Trong kết quả trả về của câu lệnh info = imaqhwinfo('winvideo' ), trường DeviceIDs cho ta tất cả các ID của tất cả các thiết bị có thể truy cập được thông qua adaptor đã chỉ ra. Cụ thể trong ví dụ trên ta dùng adaptor winvideo và có một giá trị ID trả về 1.
Để có nhiều thông tin hơn về từng thiết bị ta có thể xem cấu trúc trong trường DeviceInfo. Trường thông tin này là một mảng cấu trúc (structure array ). Mỗi một cấu trúc miêu tả từng thiết bị cụ thể. Tuy nhiên trong ví dụ trên trường DeviceIDs chỉ có một cấu trúc miêu tả một thiết bị có ID là 1. Một cách khác để lấy đầy đủ thông tin về từng thiết bị ta có thể dùng câu lệnh imaqhwinfo với cú pháp như sau:
dev_info = imaqhwinfo('matrox',1) dev_info = DefaultFormat: 'M_RS170' DeviceFileSupported: 1 DeviceName: 'Orion' DeviceID: 1 ObjectConstructor: 'videoinput('matrox', 1)' SupportedFormats: {1x10 cell}
Trong cú pháp câu lệnh trên ta chỉ ra cụ thể cả tên adaptor và ID của thiết bị.
+ Video Formats
Ta có thể lựa chọn định dạng video cụ thể cho dòng video lối vào. Để xác định xem thiết bị thu nhận ảnh của ta có thể hỗ trợ những định dạng video nào, xem thông tin trong trường SupportedFormats từ kết quả trả về của câu lệnh imaqhwinfo
Ví dụ:
vidinf=imaqhwinfo('winvideo',1) vidinf =
DefaultFormat: 'I420_160x120' DeviceFileSupported: 0
DeviceName: 'USB 2820 Video' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x18 cell} >> vidinf.SupportedFormats ans = Columns 1 through 6
'I420_160x120' 'I420_320x240' 'I420_352x240' 'I420_352x288' 'I420_640x480' 'YUY2_160x120'
Columns 7 through 12
'YUY2_320x240' YUY2_352x240' 'YUY2_352x288' 'YUY2_352x480' 'YUY2_352x576' 'YUY2_360x480'
Columns 13 through 18
'YUY2_360x576' 'YUY2_480x480' 'YUY2_480x576' 'YUY2_640x480' 'YUY2_720x480' 'YUY2_720x576'
Bước 3: Tạo một đối tượng lối vào video (video input object)
Toolbox xử lý ảnh của Matlab sử dụng một đối tượng lối vào video làm một đại diện kết nối giữa Matlab và thiết bị thu nhận ảnh. Sử dụng các thuộc tính của đối tượng này ta có thể điều khiển được quá trình thu nhận ảnh.
Để tạo một đối tượng lối vào video ta dùng câu lệnh videoinput của Matlab. Cú pháp:
obj = videoinput('adaptorname')
obj = videoinput('adaptorname', deviceID)
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
Giải thích các thành phần trong câu lệnh:
„adaptorname‟: Là một xâu kí tự chỉ ra tên của adaptor (tên của các adaptor có thể tìm thấy khi dùng câu lệnh imaqhwinfo
„deviceID‟: Là số xác định ID thiết bị. Nếu tham số này không có thì ID đầu tiên sẵn có được sử dụng như giá trị mặc định.
„format‟: Là một xâu chỉ ra định dạng video cho đối tượng. Nếu tham số này không được chỉ ra thì format mặc định của thiết bị sẽ được sử dụng.
Chú ý: Giá trị ID và định dạng của thiết bị dùng làm giá trị mặc định có thể biết được khi dùng câu lệnh: imaqhwinfo('adaptorname').
Câu lệnh videoinput sử dụng các tham số đã tìm ở bước 2 (adaptor name, device ID, and video format) để tạo ra đối tượng.
Trong các cú pháp ở trên ta thấy câu lệnh này chỉ có adaptorname là bắt buộc các tham số còn lại nếu không chỉ ra thì hàm videoinput sẽ sử dụng các giá trị mặc định
Ví dụ:
>> vidobj=videoinput('winvideo',1,'YUY2_640x480')
Summary of Video Input Object Using 'USB 2820 Video'.
Acquisition Source(s): composite, svideo, and tuner are available. Acquisition Parameters: 'composite' is the current selected source. 10 frames per trigger using the selected source.
'YUY2_640x480' video data to be logged upon START. Grabbing first of every 1 frame(s).
Log data to 'memory' on trigger.
Trigger Parameters: 1 'immediate' trigger(s) on START. Status: Waiting for START.
0 frames acquired since starting. 0 frames available for GETDATA.
Bước 4: Xem dòng tín hiệu video lối vào
Sau khi ta tạo được đối tượng lối vào video, MATLAB có thể truy cập vào thiết bị thu nhận ảnh và sẵn sàng thu nhận dữ liệu. Tuy nhiên trước khi nhận dữ liệu ta có thể xem trước dòng tín hiệu video xem có hài lòng hay không có muốn thay đối gì không ví dụ như ta muốn thay đổi vị trí của camera, thay đổi độ sáng, hay các thay đổi nào khác. Để xem tín hiệu video ta dùng câu lệnh preview(vidobj)
Ví dụ:
vidobj = videoinput(„winvideo‟,1,‟YUY2_640x480‟);
preview(vid);
Hình 3.2. Cửa sổ preview – xem dòng dữ liệu đầu vào Để đóng cửa sổ preview ta click vào nút close trên cửa sổ hoặc dùng lệnh Để đóng cửa sổ preview ta click vào nút close trên cửa sổ hoặc dùng lệnh closepreview với tham số là đối tượng lối vào video.
Closepreview(vidobj)
Bước 5: Cấu hình các thuộc tính cho đối tượng
Sau khi tạo được đối tượng lối vào video và xem trước dòng tín hiệu lối vào bây giờ ta muốn thay đổi thuộc tính của ảnh hay các bước của quá trình thu nhận ảnh. Để thực hiện được điều này ta thiết lập các giá trị của các thuộc tính của đối tượng thu nhận ảnh.
Trong phần này sẽ trình bày: Các kiểu của các đối tượng thu nhận ảnh; Làm thế nào để xem toàn bộ các thuộc tính được hỗ trợ bởi các đối tượng ở trên với các giá trị hiện thời của nó; Và làm thế nào để thiết lập các giá trị của các thuộc tính
Các kiểu của các đối tượng thu nhận ảnh
Toolbox xử lý ảnh trong Matlab sử dụng hai loại đối tượng để miêu tả kết nối với các thiết bị thu nhận ảnh đó là loại các đối lối vào video và loại các đối tượng nguồn video (Video input objects and Video source objects ).
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
Một đối tượng lối vào video miêu tả kết nối giữa Matlab và thiết bị thu nhận ảnh ở mức cao. Các thuộc tính được hỗ trợ bởi đối tượng lối vào video là giống nhau cho mọi loại thiết bị. Ta tạo đối tượng lối vào video bằng cách sử dụng câu lệnh videoinput như đã trình bày ở bước 3.
Khi ta tạo đối tượng lối vào video thì toolbox tự động tạo một hoặc nhiều đối tượng nguồn video kết hợp với đối tượng lối vào video. Mỗi đối tượng nguồn video miêu tả một hoặc nhiều nguồn dữ liệu vật lý mà nó xem như là một thực thể đơn. Số lượng đối tượng nguồn video được tạo ra phụ thuộc vào thiết bị và định dạng video ta chọn. Tại một thời điểm chỉ có duy nhất một đối tượng nguồn video tích cực.
Xem các thuộc tính đối tượng
Để xem toàn bộ danh sách của các thuộc tính được hỗ trợ bởi đối tượng lối vào video hoặc đối tượng nguồn video ta sử dụng hàm get
Ví dụ: get(vidobj) >> get(vidobj) General Settings: DeviceID = 1 DiskLogger = [] DiskLoggerFrameCount = 0 EventLog = [1x0 struct] FrameGrabInterval = 1 FramesAcquired = 0 FramesAvailable = 0 FramesPerTrigger = 10 Logging = off LoggingMode = memory
Video input object
Video Source object Video Source object Video Source object …. Currently selected source
Hình 3.3. Các kiểu của đối tượng thu nhận ảnh
Name = YUY2_640x480-winvideo-1 NumberOfBands = 3 Previewing = off ReturnedColorSpace = YCbCr ROIPosition = [0 0 640 480] Running = off Tag = Timeout = 10 Type = videoinput UserData = [] VideoFormat = YUY2_640x480 VideoResolution = [640 480] Callback Function Settings: ErrorFcn = @imaqcallback FramesAcquiredFcn = [] FramesAcquiredFcnCount = 0 StartFcn = [] StopFcn = [] TimerFcn = [] TimerPeriod = 1 TriggerFcn = [] Trigger Settings: InitialTriggerTime = [] TriggerCondition = none TriggerFrameDelay = 0 TriggerRepeat = 0 TriggersExecuted = 0 TriggerSource = none TriggerType = immediate Acquisition Sources: SelectedSourceName = composite Source = [1x3 videosource]
Ta thấy rằng là một đối tượng lối vào video có rất nhiều thuộc tính. Nắm bắt được các thuộc tính ta có thể điều khiển được quá trình thu nhận ảnh.
Để xem các thuộc tính của đối tượng nguồn video được lựa chọn hiện tại để kết hợp với đối tượng lối vào video ta sử dụng hàm getselectedsource kết hợp với hàm get.
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
get(getselectedsource(vid))
Hàm get sẽ liệt kê toàn bộ các thuộc tính và các giá trị hiện thời của nó. Thiết lập các thuộc tính của đối tượng
Để thiết lập giá trị thuộc tính của một đối tượng ta có hai cách là dùng hàm set hoặc tham chiếu đến đên thuộc tính của đối tượng như một trường trong dữ liệu cấu trúc sử dụng kí hiệu dấu chấm.
Ví dụ: Ta đặt thuộc tính cho thiết bị thu nhận ảnh nhận 30 khung ảnh(frames) trong một lần bấm
Dùng hàm set
>> set(vidobj,'FramesPerTrigger',30) Hoặc
>>vidobj.FramesPerTrigger=30
Một vài thuộc tính của đối tượng chỉ cho phép đọc(read only), ta không thể thay đổi giá trị của nó. Các thuộc tính này thường cung cấp các thông tin trạng thái của đối tượng, một vài đối tượng khác trở thành chỉ đọc khi đối tượng đang chạy
Bước 6: Thu nhận dữ liệu ảnh
Sau khi hoàn tất các bước tạo đối tượng và thiết lập các thuộc tính, ta có thể thu nhận dữ liệu ảnh đây là các bước thông thường trong các chương trình ứng dụng thu nhận ảnh. Việc thu nhận ảnh bao gồm các bước sau:
+ Khởi động đối tượng: Việc khởi động đối tượng bằng cách gọi hàm start với cú pháp
start(vidobj)
Sau khi đối tượng đã được khởi động các thuộc tính của đối tượng sẽ trở nên chỉ đọc, và đối tượng sẽ tự động dừng lại khi thu nhận đủ số khung yêu cầu, hoặc gọi hàm stop(vidobj).
Thu nhận dữ liệu: Để thu nhận dữ liệu đối tượng lối vào video phải thực hiện một trigger. Các trigger có thể xuất hiện theo nhiều cách phụ thuộc vào giá trị thiết lập của thuộc tính TriggerType. Thuộc tính này có thể nhận một trong ba giá trị là immediate (giá trị mặc định), manual, và hardware. Nếu thuộc tính TriggerType có giá trị là immediate thì ngay khi khởi động đối tượng dữ liệu sẽ được thu nhận.
Hình 3.4. Dữ liệu được nhận ngay khi khởi động đối tượng
Nếu giá trị của thuộc tính là manual thì để thu nhận dữ liệu thì sau khi khởi động đối tượng ta phải gọi hàm trigger(vidobj) để bắt đầu thu nhận dữ liệu.
Hình 3.5. Dữ liệu được thu nhận khi có lời gọi trigger
Giá trị harware chỉ có thể thiết lập nếu thiết bị thu nhận ảnh có hỗ trợ trigger bằng phần cứng.
Đưa dữ liệu vào không gian làm việc (workspace) của MATLAB
Nguyễn Văn Thắng – Luận văn thạc sĩ tổng quan về xử lý ảnh
file trên đĩa, hoặc cả hai, phụ thuộc vào giá trị của thuộc tính LoggingMode. Để thao tác với các dữ liệu đó ta phải đưa dữ liệu vào không gian làm việc của Matlab.
Đưa nhiều khung dữ liệu vào ta dùng lệnh imadata= getdata(vidobj) Đưa một khung đơn dữ liệu vào ta dùng lệnh snap=getsnapshot(vidobj)
Hình 3.6. Đưa dữ liệu vào không gian làm việc của Matlab
Bước 7: Xóa bỏ các dữ liệu ảnh trong bộ nhớ
Khi các đối tượng ảnh không cần dùng đến nữa ta có thể loại bỏ chúng khỏi bộ nhớ và xóa các biến liên quan đến các đối tượng khỏi không gian làm việc của Matlab delete(vid) clear close(gcf) 3.2. Công cụ xử lý ảnh 3.2.1. Công cụ xử lý ảnh là gì?
Công cụ thu nhận ảnh là một tập hợp các hàm hỗ trợ một phạm vi rộng trong việc xử lý ảnh, như: các phép biến đổi ảnh, phát hiện biên ảnh, đọc, viết file ảnh,…
3.2.2. Ảnh trong Matlab và công cụ xử lý ảnh
Cấu trúc dữ liệu cơ bản trong Matlab là dạng mảng, hay một tập hợp các phân tử thực hay phức. Các kiểu dữ liệu này rất phù hợp để miêu tả các ảnh như tập màu hay cường độ
Matlab lưu hầu hết các ảnh dưới dạng một mảng hai chiều (xem như một ma trận) trong đó mỗi một phần tử của mảng tương ứng với một điểm ảnh. Ví dụ một ảnh có 200 dòng và 300 cột các điểm màu có thể lưu trong Matlab thành một ma trận có kích thước 200x300. Một vài ảnh như ảnh màu (truecolor) cần đến một mảng ba chiều trong đó chiều thứ nhất miêu tả cường độ điểm màu đỏ (red), chiều thứ hai miêu tả cường độ điểm màu xanh(blue) và chiều thứ ba miêu tả cường độ điểm mầu lơ (green). Vì lý do đó mà ta quy ước làm việc với các ảnh trong Matlab chính là làm việc với các loại dữ liệu ma trận khác nhau. Ví dụ ta có thể chọn một điểm ảnh đơn từ ma trận điểm ảnh ta dùng chỉ số ma trận thông thường như I(2,10). Câu lệnh này cho