Tutorial 1

8
1 TUTORIAL 1 : Dẫn nhập OpenCV Tutorial 0 : Cài đặt thư viện OPENCV Ngày hoàn thành : 18/11/2009 Nhóm thực hiên : DeafNoFearGun I Mục đích: Nắm được chức năng 1 vài thư viện của OpenCV Hiểu và Thực hành 1 vài hàm đã định nghĩa sẵn trong thư viện hỗ trợ Giải thich về các cấu trúc dùng để lưu trữ, xử lí ảnh như: IplImage-lưu trữ ảnh, CvCapture lưu trữ file video,… II Các thao tác cơ bản: Đọc và hiển thị file có sẵn: File ảnh File video Lọc nhiễu 1 số phương pháp cơ bản: Guass Canny Đọc từ thiết bị nhập ( camera ) và hiển thị ra màn hình

Transcript of Tutorial 1

Page 1: Tutorial 1

1

TUTORIAL 1 : Dẫn nhập OpenCV Tutorial 0 : Cài đặt thư viện OPENCV Ngày hoàn thành : 18/11/2009 Nhóm thực hiên : DeafNoFearGun

I Mục đích: Nắm được chức năng 1 vài thư viện của OpenCV

Hiểu và Thực hành 1 vài hàm đã định nghĩa sẵn trong thư viện hỗ trợ

Giải thich về các cấu trúc dùng để lưu trữ, xử lí ảnh như: IplImage-lưu trữ ảnh, CvCapture – lưu trữ file video,…

II Các thao tác cơ bản: Đọc và hiển thị file có sẵn:

File ảnh

File video

Lọc nhiễu 1 số phương pháp cơ bản:

Guass

Canny

Đọc từ thiết bị nhập ( camera ) và hiển thị ra màn hình

Page 2: Tutorial 1

2

III Chi tiết: Giới thiệu thư viện OpenCV:

Cvcore: chứa cấu trúc dữ liệu cơ bản và các giải thuật

cv: chứa các giải thuật xử lí ảnh và tầm nhìn

ml: các giải thuật học máy và gom nhóm

highgui: các hàm I/O

1 Load từ file ảnh:

Lấy file ảnh hiển thị ra trong 1 cửa sổ

#include “highgui.h” int main() {

1. IplImage* img = cvLoadImage( “IloveVN.jpg” ); 2. cvNamedWindow( “Example1”, CV_WINDOW_AUTOSIZE ); 3. cvShowImage( “Example1”, img ); 4. cvWaitKey(0); 5. cvReleaseImage( &img ); 6. cvDestroyWindow( “Example1” );

}

Dòng 1.

IplImage: kiểu cấu trúc lưu giữ thông tin file ảnh cần load, như: định dạng, kích thước, dung lượng, màu sắc,…

Hàm cvLoadImage() lấy thông số hàm là ảnh được load. Hàm này load và quyết định định dạng file dựa vào file name nên cần chỉ rõ định dạng file,vd: .jpg, và đường dẫn có thể là tương đối hoặc tuyệt đối để xác định vị trí file.

Hàm này tự động cấp phát bộ nhớ cần thiết để lưu trữ ảnh. Hàm có thể đọc được nhiều định dạng: BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM,SR, RAS, và TIFF

Dòng 2:

Hàm cvNamedWindow () thiết lập cửa sổ để hiện thị ảnh.

Thông số 1: tên cửa sổ

Page 3: Tutorial 1

3

Thông số 2: thuộc tính cửa sổ, trong vd. là CV_WINDOW_AUTOSIZE tức là kích thước cửa sổ sẽ vừa khít với ảnh được hiển thị. Nếu thông số này thiết lập là 0 thì cửa sổ ở chế độ mặc định

Dòng 3:

Biến img ở dòng 1 đang lưu giữ thông tin của ảnh, sẽ được hiển thị vào cửa sổ đã được tạo ở dòng 2 qua hàm cvShowImage()

Dòng 4:

Hàm cvWaitKey() yêu cầu chờ 1 phím bất kỳ do người dùng nhập để thoát,

Nếu đối số là dương ( vd: 3 ) thì chương trình chờ trong 3ms mà ko có phím nào được bấm thì chương trình tiếp tục

Nếu đối số truyền vào ≤ 0, chương trình chờ vô hạn đến khi có phím bấm thì thoát

Dòng 5, 6:

Hàm xóa rác

Đối với chương trình xử lý ảnh, việc giải phóng bộ là cần thiết. Do đó, nên hình thành thói quen quét nhà ^^

2 Đọc từ file video: Từ file video, cụ thể là file AVI, bắt từng frame ảnh trong đoạn video, hiện thị rời rạc trong 1 cửa sổ

#include “highgui.h” int main() {

1. cvNamedWindow( “Example2”, CV_WINDOW_AUTOSIZE ); 2. CvCapture* capture = cvCreateFileCapture(“Doraemon.avi”); 3. IplImage* frame; 4. while(1) 5. { 6. frame = cvQueryFrame( capture ); 7. if( !frame ) break; 8. cvShowImage( “Example2”, frame ); 9. char c = cvWaitKey(33); 10. if( c == 27 ) break; 11. } 12. cvReleaseCapture( &capture );

Page 4: Tutorial 1

4

13. cvDestroyWindow( “Example2” ); }

Dòng 1,3,7,10,11: xem phần b.Load từ file ảnh

Dòng 2:

CvCapture: cấu trúc chứa thông tin của file AVI

Hàm cvCreateFileCapture() lấy thông số từ file AVI được load.

Khi được khởi tạo như ở dòng 2, cấu trúc CvCapture sẽ được khởi tạo từ đầu file

Dòng 4,9:

Vòng lặp while vào bắt đầu đọc file cho đến khi nhận phím c có mã ASCII là 27 ( phím ESC )

Dòng 5:

Hàm cvQueryFrame() lấy tham số kiểu CvCapture. Hàm bắt lấy video frame tiếp theo và GHI ĐÈ lên vùng nhớ của cấu trúc CvCapture tham số, sau đó trả về kiểu con trỏ cho frame

Vì vấn đề ghi đè lên vùng nhớ CvCapture, nên ko cần gọi hàm cvReleaseImage() mà frame sẽ được xóa tự động khi cấu trúc CvCapture tham số được giải phóng

Dòng 8:

Trong 33ms, nếu 1 phím nào đó được bấm thì c nhận giá trị ASCII của kí tự đó, ngược lại, c được gán bằng 1

Kết quả thu được: là hình động với khoảng thời gian giữa 2 lần hiển thị ảnh là 33ms

Page 5: Tutorial 1

5

3 Thu nhận hình ảnh từ camera và hiển thị:

Khởi động thiết bị thu hình, chương trình này sẽ lấy hình ảnh thu được từ camera và xuất ra trong 1 của sổ

#include "highgui.h"

int main()

{

CvCapture* capture;

capture = cvCreateCameraCapture(0); 1.

assert( capture != NULL );

// Rest of program proceeds totally ignorant

cvNamedWindow( "Ha'Ha'", CV_WINDOW_AUTOSIZE );

IplImage* frame;

while(1) 2.

{

frame = cvQueryFrame( capture );

if( !frame ) break;

cvShowImage( "Ha'Ha'", frame );

char c = cvWaitKey(33);

if( c == 27 ) break;

}

cvReleaseCapture( &capture );

cvDestroyWindow( "Ha'Ha'" );

}

Page 6: Tutorial 1

6

Dòng 1:

Hàm cvCreateCameraCapture() hoạt động tương tự như hàm cvCreateFileCapture() ở phần c. Đọc từ file video, nhưng là nhận dữ liệu từ camera thu vào chứ ko load từ file có sẵn

Tham số là ID của thiết bị thu cần được hiện thị, trong trường hợp có nhiều thiết bị thu cùng lúc hoạt động.

Nếu tham số nhận giá trị -1 có nghĩa là “ just pick one”

Dòng 2:

Vòng lặp while(1) cũng hoạt động như phần c. Đọc từ file video

4 Biến đổi ảnh đơn giản : Lọc nhiễu: Từ 1 ảnh input, qua phép biến đổi lọc nhiễu được định nghĩa sẵn trong thư viện cv.h, ta thu được và hiển thị ảnh output

#include "cv.h"

#include "highgui.h"

void main()

{

IplImage* image = cvLoadImage("E:\VN.jpg");

// Create some windows to show the input and output images in.

cvNamedWindow( "Example4-in" );

cvNamedWindow( "Example4-out" );

// Create a window to show our input image

cvShowImage( "Example4-in", image );

// Create an image to hold the smoothed output

Page 7: Tutorial 1

7

IplImage* out = cvCreateImage( 1.

cvGetSize(image), 2.

IPL_DEPTH_8U, 3.

3 ); 4.

// Do the smoothing

cvSmooth( image, out, CV_GAUSSIAN, 3, 3 ); 5.

// Show the smoothed image in the output window

cvShowImage( "Example4-out", out );

// Be tidy

cvReleaseImage( &out );

// Wait for the user to hit a key, then clean up the windows

cvWaitKey( 0 );

cvDestroyWindow( "Example4-in" );

cvDestroyWindow( "Example4-out" );

}

Dòng 1:

Hàm cvCreateImage() cấp phát 1 vùng nhớ cho ảnh mà ta muốn ghi lên, với các thông số:

Dòng 2:

Thông số thứ 1 của hàm cvCreateImage(): là kích thước của ảnh cần tạo, ở đây là ảnh output ( sau biến đổi Guass ) cần có kích thước

Page 8: Tutorial 1

8

bằng với ảnh input trước biến đổi, nên thông số này khởi tạo nhờ gọi hàm lấy kích thước của ảnh input: image.

Dòng 3:

Thông số thứ 2 của hàm cvCreateImage(): Giá trị bit biểu diễn cho mỗi Pixel,trong ví dụ trên là ảnh 8 bit

Dòng 4:

Thông số cuối của hàm cvCreateImage(): số kênh trên mỗi pixel

Dòng 5:

Hàm biến đổi Guass cvSmooth () với các thông số được đề cập từ trái sang phải:

ảnh đâu vào image, được biến đổi thành ảnh đầu ra out, bởi phép biến đổi Guass qua đối số CV_GAUSSIAN, và ma trận sử dụng là 3x3.

Kết quả: