Ngày nay, thế giới đang tràn ngập vơi ảnh và video số, máy tính có tốc độ xử lý ngày càng cao, và thị giác máy đã có nhiều ứng dụng thực tế được ghi nhận như nhận dạng biển số, nhận dạng vân tay, mã vạch, tương tác ngườimáy, tương tác thực ảo ….Vì thế nghiên cứu thị giác máy là một xu hướng của thế giới số. Muốn xây dựng các ứng dụng với thị giác máy chúng ta cần có công cụ và OpenCV là một chọn lựa hoàn hảo để bắt đầu, đây là thư viện mã nguồn mở được phát triển bởi hãng Intel với hơn 500 thuật toán tối ưu cho phân tích, xử lý ảnh và video số, và nó vẫn đang được phát triển bởi nhiều nhà nghiên cứu và phát triển trên thế giới.
Bộ môn TGMT và KH Rô-bốt Khoa Công nghệ thông tin ĐH Khoa học tự nhiên TP HCM SỬ DỤNG OPENCV [CTT451] – [Nhập môn Thị giác Máy tính] Tháng 3/2013 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 1 MỤC LỤC 1. Chuẩn bị: 2 2. Cấu hình OpenCV với Visual Studio C++ 2 3. Chương trình đầu tiên 6 4. Chương trình thứ hai: 7 5. Bài tập 8 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 2 CẤU HÌNH OPENCV VỚI VS C++ 1. Chuẩn bị: Download OpenCV tại: http://opencv.org/downloads.html, hoặc download thư viện OpenCV đã được biên dịch sẵn: http://www.mediafire.com/?gda0fgqi5u8h7. Gồm 3 thư mục như sau: 2. Cấu hình OpenCV với Visual Studio C++ Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 3 Tạo project Lab1: Từ Menu Project References… Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 4 Chọn Configuration Properties C/C++ General Chọn Configuration Properties Linker General Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 5 Chọn Configuration Properties Linker Input Sao chép các file đuôi *.dll vào thư mục debug của Project Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 6 3. Chương trình đầu tiên Viết chương trình tải và hiện một tập tin ảnh cho trước lên màn hình. Sau khi tạo project, bổ sung đoạn chương trình sau: #include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h> int _tmain(int argc, _TCHAR* argv[]) { IplImage * img = cvLoadImage("C:\\hinh1.jpg"); if ( img != NULL ) { cvNamedWindow( "My window" ); cvShowImage( "My window", img ); cvWaitKey();//Đợi người dùng nhấn 1 phím bất kỳ cvReleaseImage( &img ); //Giải phóng vùng nhớ cvDestroyWindow( "My window" ); //Đóng cửa sổ } return 0; } Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 7 Đoạn chương trình trên sẽ tải một ảnh lên bộ nhớ và hiển thị ra màn hình. Ta xem xét một số dòng lệnh chính: IplImage * img = cvLoadImage("C:\\hinh1.jpg"); Hàm cvLoadImage() thực hiện tải ảnh dựa vào tên file được truyền vào, đồng thời cấp phát một vùng nhớ cần thiết cho cấu trúc dữ liệu ảnh. Hàm này trả về một con trỏ trỏ tới vùng nhớ được cấp phát trên. cvNamedWindow( "My window" ); Hàm cvNamedWindow tạo một cửa sổ trên màn hình để chứa và hiển thị ảnh. cvShowImage( "My window", img ); Chúng ta đã có một ảnh dưới dạng một con trỏ IplImage *, và hiển thị nó lên của sổ vừa tạo thông qua hàm cvShowImage(). 4. Chương trình thứ hai: Viết chương trình phát một đoạn video: #include <highgui.h> int main( int argc, char** argv ) { cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE ); CvCapture* capture = cvCreateFileCapture("C:\\video1.avi"); IplImage* frame; while(1) { frame = cvQueryFrame( capture ); if( !frame ) break; cvShowImage( "Example2", frame ); char c = cvWaitKey(33); if( c == 27 ) break; } cvReleaseCapture( &capture ); cvDestroyWindow( "Example2" ); } CvCapture* capture = cvCreateFileCapture("video1.avi"); Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 8 Hàm cvCreateFileCapture() với tham số truyền vào là tên đoạn video cần load đoạn video và sẽ trả về con trỏ trỏ tới cấu trúc CvCapture. Cấu trúc này sẽ chứa toàn bộ thông tin đoạn video đã được đọc. frame = cvQueryFrame( capture ); Bên trong vòng lặp while, bắt đầu đọc đoạn video. Hàm cvQueryFrame() bắt frame kế tiếp trong đoạn video trên vào vùng nhớ (vùng nhớ này là một phần của cấu trúc CvCapture đã được cấp phát trước đó). Một con trỏ được trả về cho frame được bắt giữ này. Vì cvQueryFrame sử dụng vùng nhớ đã được cấp phát cho cấu trúc nên không cần gọi hàm cvReleaseImage() cho frame này. 5. Bài tập Viết chương trình chuyển ảnh sang ảnh mức xám (grayscale). Bộ môn TGMT và KH Rô-bốt Khoa Công nghệ thông tin ĐH Khoa học tự nhiên TP HCM LẬP TRÌNH VỚI OPENCV [CTT451] – [Nhập môn Thị giác Máy tính] Tháng 3/2013 [...]...MỤC LỤC 1 Một số hàm thông dụng trong OpenCV 2 2 Tải và hiển thị ảnh 3 3 Chuyển ảnh từ hệ màu sang ảnh độ xám .5 4 Tách các kênh màu của ảnh RGB 6 5 Bài tập 7 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 1 LẬP TRÌNH VỚI OPENCV 1 Một số hàm thông dụng trong OpenCV Hàm đọc ảnh từ file: IplImage* cvLoadImage(string... dataG[i*step+j*channels+2] = 0; dataR[i*step+j*channels] = 0; dataR[i*step+j*channels+1] = 0; } } 5 Bài tập o Tạo ảnh âm bản (negative image) của ảnh mức xám o Tạo ảnh âm bản của ảnh màu Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 7 o Thực hiện cộng thêm một hằng số vào giá trị tại mỗi điểm ảnh trên ảnh mức xám o Thực hiện với 3 hằng số, mỗi hằng số được dùng để cộng vào giá trị của kênh màu tương... 8 4 Bài tập 9 Tài liệu tham khảo 10 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 4/2013 2 1 Scale invariant feature transform (SIFT) 1.1 Xây dựng không gian tỉ lệ - Không gian tỉ lệ (scale space) gồm các ảnh (convolution) của lọc Gaussian với ảnh đầu vào - Không gian tỉ lệ được chia thành từng octave, mỗi octave gồm 1 số nguyên s ảnh Các ảnh tích chập với lọc... Canny 3 2 Cài đặt thuật toán phát hiện cạnh bằng OpenCV 4 3 Bài tập 6 Tài liệu tham khảo 7 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 4/2013 2 1 Thuật toán Phát hiện cạnh Canny Bước 1: Giảm nhiễu Thông thường để giảm nhiễu sử dụng các bộ lọc làm mờ Có thể sử dụng bộ lọc Gaussian để tích chập với ảnh: 2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2... Một số hàm Camera Calibration trong OpenCV 2 2 Tính các tham số intrinsic và extrinsic của camera .3 2.1 Xác định các điểm góc trên ảnh bàn cờ: 3 2.2 Tìm các tham số intrinsic và extrinsic 4 3 Bài tập 4 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 3/2013 Trang 1 CAMERA CALIBRATION 1 Một số hàm Camera Calibration trong OpenCV Sử dụng bàn cờ như sau: - Hàm... Thresholding) Hysteresis sử dụng 2 ngưỡng, ngưỡng thigh và tlow Pixel mà có độ lớn gradient D < tlow thì được loại ngay lập tức Những pixel tlow < D < thigh được giữ lại nếu là một cạnh liên tục với những pixel có độ lớn gradient D > thigh 2 Cài đặt thuật toán phát hiện cạnh bằng OpenCV Xây dựng class Canny như sau: class Canny { protected: IplImage *_srcImg, *_destImg; int _width, _height; int _lowThreshold,... _lowThreshold, _maxThreshold, 3); cvNamedWindow("Canny Edge Detection"); cvShowImage("Canny Edge Detection",_destImg); return 1; } Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 4/2013 5 3 Bài tập Viết chương trình phát hiện biên cạnh dựa vào thuật toán Canny như trong mục 1 Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 4/2013 6 Tài liệu tham khảo [1] Canny, J., A Computational Approach To... distortion_coeffs, NULL, NULL, CV_CALIB_FIX_ASPECT_RATIO ); // Save the intrinsics and distortions cvSave( "Intrinsics.xml", intrinsic_matrix ); cvSave( "Distortion.xml", distortion_coeffs ); 3 Bài tập - Từ tập các ảnh bàn cờ (http://courses.fit.hcmus.edu.vn/file.php/1893/Checkerboard.rar ) tìm các điểm góc và tính các tham số intrinsic và extrinsic - Hiển thị ảnh Undistort Bộ môn TGMT & KHR | Khoa... Gaussian Tìm đỉnh cao nhất trong lược đồ, các đỉnh còn lại mà đạt 80% so với đỉnh cao nhất, thì sẽ tạo keypoint ứng với hướng này 1.6 Miêu tả đặc trưng Tính độ lớn và hướng gradient của mỗi điểm xung quanh keypoint Hàm Gaussian được dùng để gán trọng số độ lớn chỗ mỗi điểm Kích thước vùng xung quanh keypoint là 16x16, và được chia thành 4x4 vùng con Vector miêu tả đặc trưng chứa giá trị của tất cả lược... giữa 2 giá trị riêng: Chỉ giữ lại những keypoint mà có: Ngưỡng đề nghị r = 10 1.5 Gán hướng cho keypoint Gán một hướng thích hợp cho keypoint dựa trên đặc tính cục bộ của ảnh, vì vậy bất biến với phép quay ảnh Với mỗi ảnh được làm mờ L(x,y) ở scale gần nhất mà keypoint được phát hiện, độ lớn gradient và hướng được tính: √ Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM | Tháng 4/2013 5 ( ) o Lược đồ . c a c u tr c CvCapture đã đư c cấp phát trư c đó). Một con trỏ đư c trả về cho frame đư c bắt giữ này. Vì cvQueryFrame sử dụng vùng nhớ đã đư c cấp phát cho c u tr c nên không c n gọi hàm cvReleaseImage(). Trộn c c kênh màu: void cvCvtPlaneToPix( const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst); Bộ môn TGMT & KHR | Khoa CNTT | ĐH KHTN TP.HCM. hàm Camera Calibration trong OpenCV 2 1. Tính c c tham số intrinsic và extrinsic c a camera 3 2. 2.1. X c định c c điểm g c trên ảnh bàn c : 3 2.2. Tìm c c tham số intrinsic và extrinsic 4