Đặt vấn đề Các ứng dụng của xử lý ảnh vào thực tế ngày càng nhiều.. Nhưng việc nghiên cứu và ứng dụng phương pháp xử lý ảnh vào thực tế đối với các sinh viên Việt Nam nói chung và sinh
Trang 1CHƯƠNG 1: MỞ ĐẦU
1.1 Đặt vấn đề
Các ứng dụng của xử lý ảnh vào thực tế ngày càng nhiều Nhưng việc nghiên cứu và ứng dụng phương pháp xử lý ảnh vào thực tế đối với các sinh viên Việt Nam nói chung và sinh viên Lạc Hồng nói riêng gặp một khó khăn đó là: phải sử dụng máy tính để thu nhận và xử lý các dữ liệu ảnh Mà máy tính thì cồng kềnh không thích hợp cho các ứng dụng thực tế
Mục đích của đề tài là sử dụng board nhúng KM9260 đang có bán trên thị trường Việt Nam kết hợp với webcam để thu nhận và xử lý ảnh phục vụ cho các ứng dụng nhúng thích hợp
1.2 Mục tiêu và phạm vi nghiên cứu
Mục tiêu của đề tài là sử dụng board nhúng KM9260 thu nhận dữ liệu ảnh từ webcam, xử lý ảnh thu được và xuất tín hiệu điều khiển ra Tín hiệu điều khiển ở ngõ ra có thể được dùng để điều khiển robot hoặc cho các mục đích điều khiển khác tùy theo nhu cầu của người sử dụng
Hình 1.1: Sơ đồ khối của hệ thống Phần thử nghiệm và đánh giá kết quả: Có thể dùng dữ liệu ảnh thu được điều khiển một robot hoặc truyền dữ liệu ảnh thu được về máy tính để hiển thị
1.3 Nội dung và phương pháp nghiên cứu
Nội dung nghiên cứu:
− Cài đặt hệ điều hành Linux nhúng trên board KM9260
− Cài đặt thư viện xử lý ảnh OpenCV trên nền Linux nhúng
− Thử nghiệm thu nhận và xử lý ảnh từ webcam
− Tổng hợp và báo cáo kết quả
Phương pháp nghiên cứu:
− Tìm hiểu lý thuyết và cách thức thực hiện bằng các tài liệu hướng dẫn liên quan
− Thử nghiệm bằng máy tính và trực tiếp trên board KM9260
BOARD NHÚNG KM9260
khiển ngõ ra
Trang 2CHƯƠNG 2: TỔNG QUAN
2.1 Tổng quan tình hình nghiên cứu
Trên thế giới đã có những sản phẩm tương tự, chất lượng tốt, nhưng giá đắt hơn
và khó khăn trong vận chuyển và thanh toán
Unibrain Fire-i board Pro™ Remote CCD [2]
Hình 2.1: Fire-i board Pro™ Remote CCD
Model Fire-i VGA Pro Fire-i XGA Pro
Image Sensor Sony 1/3" progressive scan CCD ICX-424AQ / ICX-424AL Sony 1/3" progressive scan CCD ICX-204AK / ICX-204AL Effective Pixels 330,000 pixels 659 (H) x 494 (V) 800,000 pixels 1034(H) x 779(V) Picture Size 640 x 480 1024 x 768, 800 x 600, 640 x 480 Data Path 8 bit or 12 bit color RAW and YUV 422 or 12 bit b/w
CELL size 7.40 um x 7.40 um 4.65 um x 4.65 um
Frame Rate 86 fps (Format-7), 60, 30, 15, 7.5, 3.75 36 fps (Format-7), 30, 15, 7.5, 3.75 External Trigger Mode 0, 1, 2, 3, 4, 5, 12, 13, 14, 15
Control Functions Auto-Exposure, Auto-shutter, Brightness, Sharpness
Digital Interface One or Two 1394a 6pin port / IIDC v1.31 - 8~30V DC from cable
Shutter Speed 1 usec ~ 3600 sec
Advanced Features RS-232 (SIO) pass through, Format-7, One shot & multi shot, Multi camera auto-sync, Binning 2x2, 1x2 (b/w model) S/N ratio 56 dB or better
Power Requirements 200 mA max, @ +12V DC
Dimensions / Weight Single 1394 port model: 47(W) x 70(H) x 21(D) mm / Approx 34 gr
Trang 3Dual 1394 port model: 47(W) x 81(H) x 21(D) / Approx 40 gr Operation Temp -5 to +45°C
Storage Temp -20 to +60°C
Regulations FCC, CE, MIC, RoHS
Price $590.00 $690.00
2.2 Giới thiệu board nhúng KM9260 [1]
KM9260 là board nhúng trên nền vi điều khiển ARM9 Board có kích thước nhỏ
gọn và có tính năng mạnh, sử dụng dòng vi điều khiển AT91SAM9 của ATMEL
cho phép hệ thống chạy với các hệ điều hành nhúng Linux, WinCE và µC/OS-II
RTOS Hoặc có thể chạy chương trình ứng dụng standalone như các hệ thống vi
điều khiển thông thường
Tính năng:
- MPU AT91SAM9260, 16/32 bit ARM926EJ-S 180Mhz
- Connector theo chuẩn JTAG 20 pin cho phép lập trình,
debug hệ thống
- 32MB SDRAM
- 256MB NAND FLASH
- 512kB SPI serial dataflash
- Ethernet 10/100 base RJ45 connector
- USB host, device connector - RS232 connector - Micro SD card slot
- Nút nhấn, LED hiển thị
- Connector mở rộng
- Nguồn cung cấp 5VDC
Hình 2.2: Board nhúng KM9260
Trang 4Một số ứng dụng:
Giám sát, đo lường, điều khiển từ xa qua mạng
Kiểm soát an ninh
Các ứng dụng xử lý ảnh nhúng …
2.3 Cài đặt hệ điều hành Linux nhúng lên KM9260
Chuẩn bị:
− Một thẻ microSD dung lượng tối thiểu 2GB
− Máy tính cài hệ điều hành Linux (Ubuntu 10) - PC Linux
− Chép file Debian_km9260_rootfs_121209.tar.bz2 (đĩa kèm theo board) vào một thư mục trên PC Linux
Các bước thực hiện:
− Dùng đầu đọc thẻ cắm microSD vào PC Linux
− Dùng Disk Utility (System/Administration/Disk Utility) Fdisk + Format microSD theo dạng ext2
− Mở Applications/Accessories/Terminal để dùng dòng lệnh:
$ cd /media/<microSD_name>
$ sudo tar –jxvf /<Path>/ Debian_km9260_rootfs_121209.tar.bz2
− Sau khi giải nén root lấy microSD gắn vào khe cắm trên board KM9260 và thực hiện boot Linux
2.4 Cài đặt thư viện xử lý ảnh OpenCV
OpenCV là một thư viện chứa các thuật toán xử lý ảnh được thế giới nghiên cứu
và chuyển thành mã nguồn mở (Open source code) bởi Intel Với OpenCV ta có thể thực hiện việc thu nhận và xử lý ảnh được dễ dàng và các ứng dụng xử lý ảnh sẽ được thực hiện một cách thuận tiện hơn
Việc cài đặt và sử dụng OpenCV trên máy tính đã được rất nhiều người thực hiện Phần này sẽ trình bày cách cài đặt OpenCV trên hệ điều hành Linux nhúng trên board KM9260
Chuẩn bị:
− Download source OpenCV được built sẵn dưới dạng file deb Từ [3]
download các file sau:
1 libavcodec51_0.svn20080206-18+lenny3_arm.deb
2 libgtk2.0-dev_2.12.12-1~lenny2_arm.deb
3 libjasper1_1.900.1-5.1+lenny1_arm.deb
Trang 54 libpng12-0_1.2.27-2+lenny4_arm.deb
5 zlib1g_1.2.3.3.dfsg-12_arm.deb
6 libjpeg62-dev_6b-14_arm.deb
7 zlib1g-dev_1.2.3.3.dfsg-12_arm.deb
8 swig_1.3.36-1_arm.deb
9 libavcodec-dev_0.svn20080206-18+lenny3_arm.deb
10 libjasper-runtime_1.900.1-5.1+lenny1_arm.deb
11 libtiff4_3.8.2-11.4_arm.deb
12 libpng12-dev_1.2.27-2+lenny4_arm.deb
13 python2.5_2.5.2-15+lenny1_arm.deb
14 libdc1394-13_1.1.0-5_arm.deb
15 libavformat52_0.svn20080206-18+lenny3_arm.deb
16 libgtk2.0-0_2.12.12-1~lenny2_arm.deb
17 libjpeg62_6b-14_arm.deb
18 pkg-config_0.22-1_arm.deb
19 libjasper-dev_1.900.1-5.1+lenny1_arm.deb
20 libtiff4-dev_3.8.2-11.4_arm.deb
21 python2.5-dev_2.5.2-15+lenny1_arm.deb
22 libdc1394-13-dev_1.1.0-5_arm.deb
23 libcv1_1.0.0-6.1_arm.deb
24 libcv-dev_1.0.0-6.1_arm.deb
25 libhighgui1_1.0.0-6.1_arm.deb
26 libhighgui-dev_1.0.0-6.1_arm.deb
27 libcvaux1_1.0.0-6.1_arm.deb
28 libcvaux-dev_1.0.0-6.1_arm.deb
− Chép các file trên vào một thư mục gọi là OpenCV
− Dùng WinSCP chép thư mục OpenCV này lên board KM9260
Cài đặt:
− Chuyển đến thư mục OpenCV
$ cd /<Path>/OpenCV
Trang 6− Lần lượt cài đặt các file trên bằng lệnh:
$ dpkg -i <filename.deb>
Ví dụ: $ dpkg -i libavcodec51_0.svn20080206-18+lenny3_arm.deb
Trang 7CHƯƠNG 3: THỰC NGHIỆM
3.1 Dùng KM9260 và OpenCV xử lý ảnh từ webcam nhận dạng màu đỏ
Lưu đồ giải thuật:
Hình 3.1: Lưu đồ giải thuật nhận dạng màu
OpenCV hỗ trợ các hàm thu nhận ảnh từ file và từ camera trong thư viện
“highgui.h” Thu nhận ảnh từ webcam:
CvCapture* capture = cvCreateCameraCapture(-1);
rgbimage = cvQueryFrame(capture);
Không gian màu RGB không thích hợp cho việc nhận dạng màu sắc, để phân biệt màu sắc người ta thường dùng không gian màu HSV Trong OpenCV, H (Hue)
có giá trị trong khoảng (0, 179) mang thông tin về màu sắc S (Saturation) có giá trị
Begin
Thu ảnh từ camera thường
ở không màu RGB
Xác định màu
Chuyển sang không gian
màu HSV
So sánh các thành phần H, S, V
End
Y
N
Trang 8(0, 255) cho thông tin về độ thuần khiết của màu V (Value) có giá trị (0, 255) cho biết độ sáng của điểm ảnh Chuyển đổi không gian màu từ RGB sang HSV:
cvCvtColor(rgbimage,hsvimage,CV_BGR2HSV);
Màu đỏ thường thành phần H có giá trị trong khoảng (0 - 7) & (174 - 179) Các thành phần S và V thường chọn trong lân cận 100 tùy theo điều kiện ánh sáng môi trường và yêu cầu về độ thuần khiết của màu
Code mẫu:
/*
* main.c
* Created on: Apr 8, 2011
* Author: ptnvt
*/
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
# define threshold 2000
int main(int argc, char **argv)
{
CvCapture* capture = cvCreateCameraCapture(-1);
IplImage* frame;
frame = cvQueryFrame(capture);
CvSize size = cvGetSize(frame);
cvWaitKey(3000);
IplImage* hsvimg = cvCreateImage(size,IPL_DEPTH_8U,3);
frame = cvQueryFrame(capture);
cvCvtColor(frame,hsvimg,CV_BGR2HSV);
int i, j;
unsigned long N;
int height = hsvimg->height;
int width = hsvimg->width;
int step = hsvimg->widthStep/sizeof(uchar);
int channels = hsvimg->nChannels;
uchar* hsv = (uchar *)hsvimg->imageData;
while(1) {
frame = cvQueryFrame(capture);
cvCvtColor(frame,hsvimg,CV_BGR2HSV);
N = 0;
for(i=0; i < height; i++) {
for(j=0; j < width; j++) {
if((hsv[i*step+j*channels+0]<6||hsv[i*step+j*channels+0]>74)&
& hsv[i*step+j*channels+1]>120&&hsv[i*step+j*channels+2]>100) {
N++;
}
Trang 9}
}
if (N > threshold) {
printf("Red Color\n");
}
cvWaitKey(1000);
}
return 0;
}
Biên dịch dùng lệnh:
$ gcc color.c -I /usr/include/opencv -lcv -lhighgui -o color
Gọi ứng dụng:
$ /color
Kết quả: Log gọi ứng dụng color trên Putty Khi đưa một vật có màu đỏ trước Webcam thì board sẽ thông báo “Red Color”
sam9-l9260:~/APP# /color
Corrupt JPEG data: 368 extraneous bytes before marker 0xd9
Corrupt JPEG data: premature end of data segment
Corrupt JPEG data: premature end of data segment
Corrupt JPEG data: 1005 extraneous bytes before marker 0xd9
Corrupt JPEG data: 103 extraneous bytes before marker 0xd9
Corrupt JPEG data: premature end of data segment
Red Color
Corrupt JPEG data: premature end of data segment
Red Color
Corrupt JPEG data: 117 extraneous bytes before marker 0xd9
Corrupt JPEG data: 119 extraneous bytes before marker 0xd9
Corrupt JPEG data: 506 extraneous bytes before marker 0xd9
Red Color
Corrupt JPEG data: 266 extraneous bytes before marker 0xd9
Red Color
Trang 10Corrupt JPEG data: 70 extraneous bytes before marker 0xd9
Red Color
Corrupt JPEG data: premature end of data segment
Red Color
Corrupt JPEG data: premature end of data segment
Red Color
Red Color
Corrupt JPEG data: premature end of data segment
Red Color
Corrupt JPEG data: premature end of data segment
3.2 Phát hiện đối tượng chuyển động bằng phương pháp trừ nền
Đối tượng (foreground) là một vật thể di động trước một khung cảnh cố định gọi
là nền (background) Phương pháp trừ nền để phát hiện đối tượng chuyển động như sau [4]:
− Lấy N frame ảnh liên tiếp từ webcam
− Tính giá trị trung bình và trung bình bình phương các giá trị pixel tại một vị trí trong N frame:
N
j i p j
i M
N
frame∑
=
) , ( )
, (
N
j i p j
i Sq
N
frame∑
=
2 ( , ) )
, (
trong đó, p(i,j) là giá trị của pixel tại vị trí (i,j)
− Tính phương sai:
) , ( ) , ( )
, (i j = Sq i j −M2 i j
σ
− Khi đó, một pixel tại vị trí (i,j) trong một frame được coi là thuộc một đối tượng nếu thỏa mãn điều kiện:
) , ( )
, ( ) ,
hoặc M(i,j)− p(i, j)2 ≥λ2σ2(i,j)
Trang 11Code mẫu: Đây là đoạn code thực hiện việc lấy chín frame đầu tiên làm nền
(background) Sau đó, lấy một frame tiếp theo so sánh với chín frame trước để xác
định xem trong đó có đối tượng nào xuất hiện hay không?
/*
* main.c
*
* Created on: Apr 5, 2011
* Author: ptnvt
*/
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
# define threshold 5000
int main()
{
CvCapture* capture = cvCreateCameraCapture(0);
IplImage* frame;
frame = cvQueryFrame(capture);
CvSize size = cvGetSize(frame);
IplImage* graytemp = cvCreateImage(size,IPL_DEPTH_8U,1);
size.height >>= 2; // size/4: giảm độ phân giải của ảnh để tăng size.width >>= 2; // tốc độ xử lý
IplImage* temp = cvCreateImage(size,IPL_DEPTH_8U,1);
IplImage* backg = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* foreg = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* sqbackg = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* acc = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* sqacc = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* M = cvCreateImage(size,IPL_DEPTH_32F,1);
IplImage* sqM = cvCreateImage(size,IPL_DEPTH_32F,1);
int step = backg->widthStep/sizeof(float);
float * foregdata = (float *)foreg->imageData;
float * accdata = (float *)acc->imageData;
int i, j;
unsigned int N;
cvWaitKey(500); // Chờ cho webcam khởi động ổn định
for(i = 0; i < 9; i++) {
frame = cvQueryFrame(capture);
cvCvtColor(frame,graytemp,CV_BGR2GRAY);
cvResize(graytemp,temp,CV_INTER_NN);
cvConvertScale(temp, backg, 1, 0);
cvAcc(backg, acc, NULL);
cvSquareAcc(backg, sqacc, NULL);
cvWaitKey(1);
}
Trang 12cvConvertScale(acc, backg, 1, 0); // backg = acc
cvConvertScale(sqacc, sqbackg, 1, 0); // sqbackg = sqacc
while(1)
{
frame = cvQueryFrame(capture);
cvCvtColor(frame,graytemp,CV_BGR2GRAY);
cvResize(graytemp,temp,CV_INTER_NN);
cvConvertScale(temp, foreg, 1, 0);
cvAcc(foreg,acc,NULL);
cvSquareAcc(foreg, sqacc, NULL);
cvConvertScale(acc, M, 0.1, 0); // M(x,y) = acc/N cvConvertScale(sqacc, sqM, 0.1, 0); // Sq(x,y)= sqacc/N cvSub(M, foreg, acc, NULL); // |M(x,y)-P(x,y)| = acc cvMul(acc, acc, foreg, 1); // |M(x,y)-P(x,y)| 2 = foreg cvMul(M, M, acc, 1); // M(x,y) 2 = acc
cvSub(sqM, acc, sqacc, NULL); // sigma(x,y) 2 = sqacc cvConvertScale(sqacc, acc, 6, 0);// lambda 2 sigma(x,y) 2 = acc
N = 0;
for(i=0; i < size.height; i++) {
for(j=0; j < size.width; j++) {
if (foregdata[i*step+j] > accdata[i*step+j]) { N++;
} }
}
if (N > threshold) {
printf("Co mot doi tuong moi xuat hien\n");
} cvConvertScale(backg, acc, 1, 0); // acc = backg;
cvConvertScale(sqbackg, sqacc, 1, 0); // sqacc = sqbackg cvWaitKey(1);
}
return 0;
}
Trang 13KẾT LUẬN
Kết quả thực hiện được của đề tài đã đạt được mục đích đặt ra ban đầu Với khả năng của board nhúng KM9260 phù hợp cho một số ứng dụng xử lý ảnh đơn giản, giúp nâng cao khả năng ứng dụng công nghệ xử lý ảnh vào cuộc sống
Bước tiếp theo của đề tài là sử dụng KM9260 cho một ứng dụng cụ thể đó là: Robot nhận dạng chuyển động
Trang 14TÀI LIỆU THAM KHẢO
[1] “KM9260 TECHNICAL REFERENCE REV1.0l”, www.thegioiic.com [2] http://www.unibrain.com/Products/VisionImg/boardXGA.htm
[3] http://packages.debian.org/lenny/arm/
[4] http://blog.damiles.com/?p=127
[5] Intel Corporation (1999-2001), Open Source Computer Vision Library,
http://developer.intel.com
[6] Gary Bradski, Adrian Kaehler (2008), Learning OpenCV – Computer
Vision with the OpenCV Library, O’reilly Media Inc, Sebastopol, CA
Trang 15PHỤ LỤC