Open Source Computer Vision Library.
Là sản phẩm của Intel.
Là một bộ thư viện rất tốt và cực mạnh, hỗ trợ hầu hết tất cả những thao các cơ bản trong các vấn đề của Computer Vision.
Được viết bằng ngôn ngữ C.
Được sử dụng nghiều
56 trang |
Chia sẻ: lylyngoc | Lượt xem: 2252 | Lượt tải: 3
Bạn đang xem trước 20 trang tài liệu Xử lý ảnh trong rôbốt, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Giới thiệu OpenCV Sử dụng OpenCV Cài đặt OpenCV với Visual Studio 2008 Ví dụ minh họa Open Source Computer Vision Library. Là sản phẩm của Intel. Là một bộ thư viện rất tốt và cực mạnh, hỗ trợ hầu hết tất cả những thao các cơ bản trong các vấn đề của Computer Vision. Được viết bằng ngôn ngữ C. Được sử dụng nghiều Tất các các từ khóa, các hằng đều được viết hoa toàn bộ, bắt đầu bởi tiếp đầu ngữ “CV”, các từ cách nhau bởi dấu gạch dưới (_). Ví dụ: CV_RGB2GRAY . Tên của hàm và cấu trúc được viết hoa chữ cái đầu mỗi chữ có nghĩa và sử dụng tiếp đầu ngữ “cv” cho hàm và “Cv” cho cấu trúc. Ví dụ: hàm cvFindContours và cấu trúc CvPoint. Tên của một hàm có cấu trúc như sau: cv : Thao tác nào được sử dụng. Ví dụ như –Set–, –Convert–, –Create–. : Chỉ định đối tượng mà hành động hướng tới. Ví dụ: cvGetRow, cvCreateImage,… : là một tham số không bắt buộc, xác định kiểu tác động của hàm. Ví dụ: cvGet1D, cvGet2D cvFindExtrinsicCameraParams_64d CxCore bao gồm: Các cấu trúc dữ liệu cơ bản Các thao tác lên array Các hàm vẽ Các cấu trúc động Các hàm tác động lên dữ liệu Một số hàm và cấu trúc cần thiết khác CvPoint: cấu trúc tọa độ của 1 điểm ảnh Cùng họ với CvPoint còn có: CvPoint2D32f: chứa tọa độ thực, CvPoint3D32f: chứa tọa độ thực của điểm trong không gian. Ngoài ra còn có CvPoint2D64f, CvPoint3D64f CvSize: Chứa thông tin để lưu lại kích thước CvRect: Hình chữ nhật CvMat: ma trận (một cấu trúc được sử dụng khá nhiều.) IplImage: Chứa đựng thông tin của 1 ảnh. Nhóm Create: Là những hàm khởi tạo các cấu trúc cvCreateImage, cvCreateMat Nhóm tác động vào những phần tử của Array cvGetRow, cvGetCol, … Nhóm các hàm Copy và Fill cvCloneImage, cvCopy Các hàm thay đổi hình dạng cvReshape, cvRepeat, … Các thao tác số học cvAdd, cvSub, cvMax, ... Các hàm đại số tuyến tính. tiêu biểu là nhân ma trận, tích hữu hướng, tích vô hướng… cvDotProduct, cvMatMul,… Các biến đổi rời rạc cvDFT, cvDCT,... Các hàm tạo số ngẫu nhiên cvLine: vẽ đoạn thẳng cvRectangle: vẽ hình chữ nhật cvCircle: vẽ hình tròn cvEllipse: vẽ hình ellipse … Nhóm xử lý ảnh Các hàm lấy mẫu, nội suy và biến đổi hình học: Các biến đổi Affine, biến đổi kích thước, … Các hàm làm việc trên các thành phần liên thông: như tìm các component, tìm các đường viền (FindContour)… Các bộ lọc: Các hàm chuyển đổi hệ màu, bộ lọc Median, bộ lọc Gaussian, Threshold… … Nhóm phân tích cấu trúc Các xử lý trên Contour(đường biên): bao gồm xấp xỉ Contour, tính diện tích Contour… Các tính toán hình học: Ví dụ: tìm hình chữ nhật có diện tích nhỏ nhất chứa 2 hình chữ nhật cho trước Một số nhóm khác Phân tích chuyển động của điểm ảnh Phân đoạn ảnh (segmentation)… Nhóm tác động lên giao diện Các hàm làm việc với cửa sổ: gồm các hàm tạo cửa sổ, hủy cửa sổ, lấy Handle của một của sổ, thay đổi kích thước của một cửa sổ. Làm việc với chuột và bàn phím: Cung cấp một số hàm cơ bản xử lý những sự kiện tương ứng với chuột và bàn phím. Các hàm hiển thị ảnh lên cửa sổ: Ở đây chỉ có một hàm duy nhất: cvvShowImage. Nhóm tác động lên file ảnh cvLoadImage: đọc một ảnh vào cấu trúc IplImage cvSaveImage: Lưu một ảnh vào file Cài Visual Studio Cài OpenCV 2.1.0 Liên kết thư viện - Copy toàn bộ file .h trong thư mục trong: C:\OpenCV2.1\include\opencv vào thư mục: C:\Program Files\Microsoft Visual Studio 9.0\VC\include - Copy tất cả các file .lib trong thư mục: C:\OpenCV2.1\lib vào thư mục: C:\Program Files\Microsoft Visual Studio 9.0\VC\lib - Copy tất cả các file .dll trong thư mục: C:\OpenCV2.1\bin vào thư mục: C:\WINDOWS\system32 Cài đặt Visual Studio 2008 và OpenCV Vào Project-> Properties (Alt+F7)->Configuration Properties->Linker->Input->Additional Dependencies và gõ đoạn text sau: cv210d.lib cxcore210d.lib highgui210d.lib cv210.lib cxcore210.lib highgui210.lib Cài đặt Visual Studio 2008 và OpenCV File/New/Project/C++/Empty Project Tạo file mới để lập trình 1. Tạo biến chứa thông tin ảnh và video a. Hàm: IplImage* ten_anh = 0; // chua thong tin anh CvCapture* ten_video =0; // chưa thong tin video b. Ví dụ: Một số hàm cơ bản của OpenCV * Tạo một khung anh mới: cvNamedWindow("Color", CV_WINDOW_AUTOSIZE); * Hiện thị 1 ảnh: cvShowImage("Color",img); * Đóng cửa sổ ảnh: cvDestroyWindow("Color"); * Đọc thông tin ảnh cvGetSize() Một số hàm cơ bản của OpenCV 2. Đọc và hiện thị file ảnh từ máy tính.a. Hàm: cvLoadImage() IplImage* ten=cvLoadImage(“đường dẫn”); cvShowImage("anh",ten); b. Ví dụ: #include "cv.h" #include "highgui.h" #include int main() { IplImage* ten=cvLoadImage("c:/1.jpg"); // load anh cvShowImage("anh",ten); // hien thi anh cvWaitKey(); // cho den khi an 1 phim return 0; } Một số hàm cơ bản của OpenCV 3. Lưu ảnha. Hàm: cvSaveImage() b. Ví dụ: #include "highgui.h" int main() { IplImage* ten=cvLoadImage("c:/1.jpg"); // load anh cvShowImage("anh",ten); // hien thi anh cvSaveImage("D:/test.bmp",ten); // Lưu ảnh với một tên khác cvWaitKey(); // cho den khi an 1 phim return 0; } Một số hàm cơ bản của OpenCV Hệ màu: Có 2 hệ màu hay dùng là: RGB - gồm 3 màu cơ bản R: đỏ G: xanh lá cây B: xanh da trời HSV(B) - gồm 3 thành phần H: màu sắc S: độ bão hòa V(B): độ sáng Trong xử lý ảnh hay dùng hệ HSV để xử lý, tìm khối màu. Một số hàm cơ bản của OpenCV 4. Chuyển hệ màu: a. Hàm: cvCvtColor(anh_nguon,anh_dich, CV_BGR2HSV);// chuyen he mau cvCvtColor(anh_mau,anh_xam,CV_RGB2GRAY); // chuyen sang mau sam b. Ví dụ: #include "cv.h" #include "highgui.h" int main() { IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh cvShowImage("anh",im_rgb); // hien thi anh IplImage*im_gray= cvCreateImage(cvGetSize(im_rgb),IPL_DEPTH_8U,1); cvCvtColor(im_rgb,im_gray,CV_RGB2GRAY); cvShowImage("Anh Gray",im_gray); cvWaitKey(); return 0; } Một số hàm cơ bản của OpenCV 5. Tách các kênh màu: a. Hàm: cvSplit(im_rgb, imgBlue, imgGreen, imgRed, 0); b. Ví dụ: #include "cv.h" #include "highgui.h" int main() { IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh cvShowImage("anh",im_rgb); // hien thi anh IplImage* imgRed = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1); IplImage* imgGreen = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1); IplImage* imgBlue = cvCreateImage(cvGetSize(im_rgb), IPL_DEPTH_8U, 1); cvSplit(im_rgb, imgBlue, imgGreen, imgRed, 0); cvShowImage("Blue Channel",imgBlue); cvShowImage("Green Channel",imgGreen); cvShowImage("Red Channel",imgRed); cvWaitKey(); return 0; } Một số hàm cơ bản của OpenCV 6. Truy cập vào từng điểm ảnh a. Hàm: cvGet2D() cvSet2D() - s=cvGet2D(img, i, j); s gồm 3 thành phần s.val[2] – R (0-255) s.val[1] – G (0-255) s.val[0] – B (0-255) - cvSet2D(img, i, j, s); Một số hàm cơ bản của OpenCV b. Ví dụ: - Tìm các điểm ảnh có màu đỏ >100 #include "cv.h" #include "highgui.h" int main() { IplImage* im_rgb=cvLoadImage("c:/1.jpg"); // load anh cvShowImage("anh",im_rgb); // hien thi anh IplImage* copy=cvCreateImage(cvGetSize(im_rgb),8,3); //Create a new image CvScalar s,c; // create two scalar variables for(int i=0;iheight);i++) { for(int j=0;jwidth);j++) { s=cvGet2D(im_rgb,i,j); if((s.val[2]>100)) { c.val[2]=255; c.val[1]=0; c.val[0]=0; cvSet2D(copy,i,j,c); } else { c.val[2]=0; c.val[1]=0;c.val[0]=0; cvSet2D(copy,i,j,c); } } } cvShowImage("Red",copy); // hien thi anh cvWaitKey(); // cho an 1 phim bat ky return 0; } 7. Hàm vẽ đường thẳng, đường tròn, chư nhật… a. Hàm: cvLine(img, cvPoint(x,y), cvPoint(X,Y), cvScalar(0,0,255), 2); cvCircle(img, cvPoint(X,Y), 3, CV_RGB(255,0,0), 3, 8, 0 ); cvRectangle(img,cvPoint(x,y), cvPoint(X,Y), cvScalar(0,255,255), 3); b. Ví dụ: Một số hàm cơ bản của OpenCV 8. Đọc cameraa. Hàm: cvCaptureFromCAM(CV_CAP_ANY) b. Ví dụ: #include "cv.h" #include "highgui.h" #include int main() { CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); while ( 1 ){ IplImage* frame = cvQueryFrame( capture ); // chụp ảnh động cvShowImage("Camera", frame ); if ( (cvWaitKey(10) & 255) == 27 ) break; // an Esc de thoat } } Một số hàm cơ bản của OpenCV 9. Nhân dang khuôn mặt Trong OpenCV đã có sẵn file “haarcascade_frontalface_alt.xml”, ta chỉ việc lấy nó ra và sử dụng. Đường dẫn: “ C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml ”. Ví dụ: Tìm khuôn mặt trong anh. Một số hàm cơ bản của OpenCV Ví dụ: Tìm khuôn mặt trong ảnh. #include "cv.h" #include "highgui.h" #include int main() { while ( 1 ) { IplImage* anh = cvLoadImage("c:/2.jpg"); // load anh CvHaarClassifierCascade * con_tro = 0; //con trỏ nhận diện, CvMemStorage * dem = 0; //khởi tạo bộ nhớ đệm dem = cvCreateMemStorage(0); con_tro= (CvHaarClassifierCascade*)cvLoad(("C:/OpenCV2.1/data/ haarcascades/haarcascade_frontalface_alt.xml"),0,0,0); CvSeq * khuon_mat= cvHaarDetectObjects(anh,con_tro, dem, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(0,0)); //vẽ hình chữ nhật xung quanh khuôn mặt Ví dụ: Tìm khuôn mặt trong ảnh. //vẽ hình chữ nhật xung quanh khuôn mặt for (int i=0;itotal:0);i++) { CvRect * r = (CvRect*)cvGetSeqElem(khuon_mat,i); CvPoint pt1 = {r->x,r->y}; CvPoint pt2 = {r->x + r->width,r->y + r->height}; cvRectangle(anh,pt1,pt2,CV_RGB(255,255,0),3,4,0); } cvShowImage("Nhan dien khuon mat",anh ); cvWaitKey(); } return 0; } Ví dụ: - Viết chương trình tìm mặt trong camera. Một số hàm cơ bản của OpenCV Sơ đồ khối: (Rs232) Xử lý ảnh trong rôbốt Camera Máy tinh (xử lý) Chíp (AVR) Động cơ Thuật toán: Xử lý ảnh trong rôbốt Chụp ảnh Lọc Xử lý màu Tạo ngưỡng Tìm tọa độ màu Truyền thông Xử lý ảnh trong rôbốt Height Width a b c … 1 2 . . . Thuật toán tìm tọa độ màu và truyền thông Chương trình tạo ngưỡng (tìm khối màu đỏ). IplImage* tao_nguong(IplImage* frame) { IplImage* imgHSV = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3); cvCvtColor(frame, imgHSV, CV_BGR2HSV); //from RGB to HSV IplImage*img=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1); cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,255,255), img); return img; } Tác dụng: tìm ra khối màu đỏ thỏa mãn điều kiện đề ra. Chương trình tìm tọa độ khối màu void trackObject( IplImage* img) { CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments)); cvMoments(img, moments, 1); double moment10 = cvGetSpatialMoment(moments, 1, 0); double moment01 = cvGetSpatialMoment(moments, 0, 1); double area = cvGetCentralMoment(moments, 0, 0); if(area>100) { int posX = moment10/area; // truyền thông giá trị này int posY = moment01/area; // truyền thông giá trị này } free(moments); } Ví dụ: - Viết chương trình tìm và theo dõi màu đỏ trong camera. ( theo dõi bằng cách vẽ đường theo màu di chuyển ) Một số hàm cơ bản của OpenCV LẬP TRÌNH GIAO DIỆN 1. Cài đặt cổng COM this->serialPort1->PortName = "COM1"; // đặt tên là Com1 this->serialPort1->BaudRate = 9600; // tốc độ truyền 9600 this->serialPort1->Open(); // mở cổng this->serialPort1->WriteLine("@"); // truyền ký tự @ LẬP TRÌNH GIAO DIỆN 2. Hiện thị số lên textbox textBox1->Text = so.ToString(); LẬP TRÌNH GIAO DIỆN 2. TrackBar this->trackBar2->Value = 2; // thiết lập trackBar2 = 2 textBox1->Text = this->trackBar2->Value ; // hiển thị lên textbox1 LẬP TRÌNH GIAO DIỆN 3. Timer timer1->Interval = 1; timer1->Enabled = false; timer2->Interval = 10; timer2->Enabled = true; LẬP TRÌNH GIAO DIỆN 4. checkBox this->checkBox1->Checked == true this->checkBox1->Checked == false LẬP TRÌNH GIAO DIỆN 5. Chương trình con private: System::Void captureImage(void) { } private: System::Void captureImage( IplImage* img) { } Viết chương trình LẬP TRÌNH GIAO DIỆN 6. Chương trình chụp ảnh private: System::Void chup_anh(Void) { CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); srcImage = cvQueryFrame(capture); } LẬP TRÌNH GIAO DIỆN 7. Chương trình xử lý ảnh, tìm ra loan độ… private: System::Void xu_ly_anh(IplImage* img) { // chương trình hôm trước } LẬP TRÌNH GIAO DIỆN 8. Hiện thị ảnh lên pictureBox private: System::Void hien_thi_anh( IplImage* img) { IplImage* srcImage = img; if((pictureBox1->Image == nullptr)) { Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height); pictureBox1->Image = bmpPicBox; } Graphics^ g = Graphics::FromImage(pictureBox1->Image); Bitmap^ bmp = gcnew Bitmap(srcImage->width, srcImage->height, srcImage->widthStep, System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(srcImage->imageData)); g->DrawImage(bmp, (pictureBox1->Width-srcImage->width)/2, (pictureBox1->Height-srcImage->height)/2); pictureBox1->Refresh(); delete(g); } LẬP TRÌNH GIAO DIỆN 9. Hiện thị ảnh lên pictureBox, trong timer private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { chup_anh(); xu_ly_anh(srcImage1); hien_thi_anh(srcImage2); } LẬP TRÌNH GIAO DIỆN 10. Bài tập Bài 1: Viết giao diện xử lý ảnh cho robot xoay theo vật màu đỏ. Bài 2: Viết giao diện xử lý ảnh cho robot xoay, dữ khoảng cách với vật màu đỏ. Hướng dẫn Hướng dẫn #include #include using namespace std; private: System::Void load(void) { ifstream red_; red_.open(“D:\abc.txt "); red_>>r_r;red_>>r_g;red_>>r_b; red_.close(); textBox1->Text = r_r.ToString(); textBox2->Text = r_g.ToString(); textBox3->Text = r_b.ToString(); } #include #include using namespace std; private: System::Void load(void) { ifstream red_; red_.open(“D:\abc.txt "); red_>>r_r;red_>>r_g;red_>>r_b; red_.close(); textBox1->Text = r_r.ToString(); textBox2->Text = r_g.ToString(); textBox3->Text = r_b.ToString(); } #include #include using namespace std; private: System::Void save(void) { ofstream save; save.open(“ "); if(save ==NULL){MessageBox::Show("ERROR: Khong doc duoc file"); return;} save <<r_r<<endl; save <<r_g<<endl; save <<r_b<<endl; save.flush(); save.close(); }