Cấu trúc ảnh IplImage

Một phần của tài liệu Điều khiển bám cho robot di động đa hướng dùng bộ điều khiển trượt ( đính kèm full tệp) (Trang 62)

5 Nội dung nghiên cứu

2.6.3Cấu trúc ảnh IplImage

IplImage là định dạng ảnh được giới thiệu và phát triển bởi Intel. Chuẩn IplImage được sử dụng rộng rãi trong xử lý ảnh, tối ưu hóa quá trình xử lý nhờ quản lý các nhóm dữ liệu dưới dạng các Field. Quá trình xử lý được thực hiện trên các trường làm tăng khả năng linh hoạt và tốc độ xử lý dữ liệu. Định dạng IplImage được dùng rộng rãi trong các bộ thư viện xử lý ảnh như IPL ( Image Procesing Library) hay IPP ( Intergrated Performance Primitives), OpenCV, AMM,...

Cấu trúc IplImage trong OpenCV như sau:

typedef struct _IplImage {

int nSize; int ID;

int nChannels;

int alphaChannel; // OpenCV không sử dụng int depth;

char colorModel[4]; // OpenCV không sử dụng char channelSeq[4]; // OpenCV không sử dụng int dataOrder;

int origin;

int align; // OpenCV không sử dụng int width;

int height;

struct _IplImage *maskROI; // bằng NULL trong OpenCV

void *imageId; // bằng NULL trong OpenCV

struct _IplTileInfo *tileInfo; // bằng NULL trong OpenCV int imageSize;

char *imageData; int widthStep;

int BorderMode[4]; // OpenCV không sử dụng int BorderConst[4]; // OpenCV không sử dụng char *imageDataOrigin;

}

IplImage;

Các tham số:

nSize : Kích thước của ảnh

ID : Chỉ số version, luôn bằng 0

nChannels : Số kênh, các hàm của OpenCV đều hỗ trợ từ 1-4 kênh alphaChannel : OpenCV không sử dụng

depth : Chiều sâu của pixel theo bit, có các dạng sau : IPL_DEPTH_8U : unsigned 8-bit integer

IPL_DEPTH_8S : signed 8-bit integer IPL_DEPTH_16U : unsigned 16-bit interger

dataOder : 0 = IPL_DATA_ORDER_PIXEL Các kênh màu đan xen nhau, 1 = Các kênh màu tách rời

origin : Gốc tọa độ 0 = top-left origin, 1 = bottom-left origin width : Bề rộng ảnh theo pixel

height : Chiều cao ảnh theo pixel

roi Region of Interest (ROI) nếu bằng NULL thì chỉ có vùng ROI được xử lý

imageSize : Kích thước dữ liệu ảnh theo byte

imageData : Một pointer trỏ tới vùng địa chỉ ảnh

2.6.4 Các hàm dùng trong luận văn :

 Thu nhận ảnh từ camera : (adsbygoogle = window.adsbygoogle || []).push({});

CvCapture* cvCaptureFromCAM(int index);

Trong đó index là chỉ số camera được sử dụng, nếu có 1 camera, index = -1 Chức năng : Thu nhận hình ảnh từ camera và trả về pointer có kiểu là CVCapture.

 Giải phóng camera :

void cvReleaseCapture( CvCapture**capture);

Trong đó capture là địa chỉ của Pointer có kiểu cvCapture

 Lấy hình từ camera :

IplImage* cvRetrieveFrame( CvCapture* capture); hay IplImage* cvQueryFrame( CvCapture* capture);

 Đọc thuộc tính của camera

double cvGetCaptureProperty( CvCapture* capture, int property_id);

trong đó capture có kiểu CvCapture đại diện cho camera đang làm việc property_id có thể có các giá trị sau :

CV_CAP_PROP_POS_MSEC : Camera frame timestamp

CV_CAP_PROP_POS_FRAMES: 0-based index of the frame to be decoded/capture next. CV_CAP_PROP_POS_AVI_RATIO : (Dùng cho file avi)

CV_CAP_PROP_FRAME_EIDTH : Bề rộng của video stream CV_CAP_PROP_FRAME_HEIGHT: Bề cao của video stream CV_CAP_PROP_FPS : frame per second

CV_CAP_PROP_FRAME_COUNT : Số thứ tự của frame

Đặt thuộc tính cho camera

int cvSetCaptureProperty ( CvCapture* capture, int property_id, double value);

Trong đó capture có kiểu CvCapture* đại diện cho camera, property_id có các giá trị như trong phần đọc thuộc tính của camera, value là gía trị của thuộc tính.

Tạo một ảnh :

IplImage* cvCreateImage(CvSize size, int depth, int channels)

Hàm trả về một pointer trỏ đến hình ảnh có cấu trúc IplImage, trong đó : size : Kích thước ảnh

depth : Số bit biểu diễn độ sáng tại mỗi pixel channels : Số kênh

Giải phóng pointer trỏ tới ảnh:

void cvReleaseImage( IplImage** image);

Trong đó image là pointer trỏ tới hình ảnh có cấu trúc IplImage

void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask = NULL); Trong đó :

src : Ảnh nguồn dst : Ảnh đích

mask : Mặt nạ phủ lên ảnh nguồn nếu ta chỉ muốn copy một phần ảnh.

Xác định vùng ảnh cần xử lý (ROI)

void cvSetImageROI(IplImage* image, CvRect rect);

Trích một cùng ảnh ban đầu thành một vùng ảnh mới, nằm trong hình chữ nhật rect. Sau khi trích, image là pointer trỏ tới hình ảnh này. (adsbygoogle = window.adsbygoogle || []).push({});

Cân bằng histogram cho ảnh xám

Để thực hiện việc cân bằng histogram ta dùng hàm sau : CVAPI(void) cvEqualizeHist( const CvArr*scr, const CvArr* dst) Trong đó :

scr : Hình ảnh gốc ban đầu

dst : Hình ảnh sau khi cân bằng histogram

Phát hiện khuôn mặt trong ảnh

CvSeq* cvHaarDetectObjects(const CvArr* image, CvHaarClassifierCascade* cascade,

CvMemStorage* storage, double scale_factor=1.1, int min_neighbors = 3, int flags = 0,CvSize min_size = cvSize(0,0))

Trong đó:

 image : Ảnh cần phát hiện

 cascade : Chuỗi phân lọai Haar dùng cho tính tóan bên trong

 storage : Vùng nhớ chứa các kết quả trung gian trong quá trình phân lọai

 scale_factor : Tham số mà theo đó kích thước cửa sổ tìm kiếm tăng lên sau mỗi chu kì quét, mặc định là 1.1 tức tăng 10%

 min_neighbors : Số nhỏ nhất các hình chữ nhật kế cận cùng phát hiện khuôn mặt. Điều này có

nghĩa khuôn mặt được phát hiện nếu có ít nhất một số hình chữ nhật có cùng kết quả dương chồng lấp lên nhau.

 flags : Chế độ họat động, chỉ hỗ trợ HAAR_DO_CANNY_PRUNNING

 min_size : Kích thước cửa sổ nhỏ nhất khi bắt đầu tìm kiếm, thường là 20x20 cho đối tượng là

khuôn mặt. Hàm này tìm các vùng hình chữ nhật trong hình có chứa khuôn mặt với chuỗi phân loại được huấn luyện và trả về một mảng các hình chữ nhật. Trước khi gọi hàm này ta phải load file dữ liệu trong OpenCv :

cascadefaces = (CvHaarClassifierCascade*)cvLoad(filename_face,NULL,NULL,NULL); với filename_face là đường dẫn đến file dữ liệu nằm trong phần dữ liệu của OpenCv.

Một phần của tài liệu Điều khiển bám cho robot di động đa hướng dùng bộ điều khiển trượt ( đính kèm full tệp) (Trang 62)