Tải bản đầy đủ (.docx) (31 trang)

Extract face sequences from video

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (629.62 KB, 31 trang )

Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
Trường đại học Bách Khoa Hà Nội
Viện công nghệ thông tin và truyền thông
Bộ môn kĩ thuật máy tính
Bài tập lớn môn xử lý ảnh:
Extract face sequences from video
Nhóm thực hiện:
 Lê Xuân Bách Kĩ thuật máy tính K52
 Phạm Kiên Giang Kĩ thuật máy tính K52
 Nguyễn Đình Nam Kĩ thuật máy tính K52
 Đồng Thị Tâm Kĩ thuật máy tính K52
Giáo viên hướng dẫn : Gv. Hoàng Văn Hiệp.
1
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
Mục lục
1. Giới thiệu về OpenCV
OpenCV là mã nguồn mở của Intel, nó là một thư viện có khả năng nhúng
vào trong các chương trình có khả năng nhận diện hình ảnh của máy
tính .Nó bao gồm khả năng tiên tiến như phát hiện khuôn mặt, theo dõi
khuôn mặt, nhận diện khuôn mặt….. Ngoài ra, nó cung cấp rất nhiều các
thuật toán xử lý ảnh thông qua các hàm API.
1.1. Tổng quan OpenCV
Intel phát hành phiên bản đầu tiên của OpenCV vào năm 1999. Ban
đầu, nó yêu cầu như là thư viện xử lý hình ảnh của Intel. Nhưng các vấn
đề phụ thuộc đã được gỡ bỏ và bây giờ bạn có thể sử dụng OpenCV là
một thư viện độc lập.
OpenCV hỗ trợ đa nền tảng. Nó hỗ trợ cả Windows và Linux, và gần đây
hơn là MacOSX. Với giao diện của nó là nền tảng độc lập.
2
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
Hình 1. Các khả năng của OpenCV có thể là nhận diện khuôn mặt (trên


cùng bên trái), phát hiện đường đồng mức (trên bên phải), và phát hiện
cạnh (phía dưới)
1.1.1. Các tính năng
Dưới đây là một bản tóm tắt của các loại chức năng quan
trọng trong OpenCV, phiên bản 1.0:
• General computer-vision and image-processing algorithms (mid-
and low-level APIs).
Sử dụng các interface này, bạn có thể thử nghiệm nhiều tiêu
chuẩn thuật toán tầm nhìn máy tính mà không cần phải code
chúng. Bao gồm các việc như : phát hiện cạnh, đường, và phát
hiện góc, hình elip, kim tự tháp ….và nhiều hơn nữa .
• High-level computer-vision modules
OpenCV bao gồm một số khả năng cao cấp. Ngoài việc phát
hiện khuôn mặt, nhận diện, và theo dõi, nó còn bao gồm dòng
chảy quang học (bằng cách sử dụng máy ảnh chuyển động để xác
định cấu trúc 3D), hiệu chuẩn máy ảnh.
3
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
• AI and machine-learning methods.
Ứng dụng tầm nhìn máy tính thường đòi hỏi máy học hoặc sử
dụng phương thức AI khác. Một số trong số này là có sẵn trong
gói phần mềm OpenCV's Machine Learning
• Image sampling and view transformations.
Thường hữu ích để xử lý một nhóm các điểm ảnh như một
khối . OpenCV bao gồm giao diện cho tiểu vùng trích xuất hình
ảnh, lấy mẫu ngẫu nhiên, thay đổi kích thước, cong vênh, xoay,
và các hiệu ứng quan điểm áp dụng .
• Methods for creating and analyzing binary (two-valued) images
Ảnh nhị phân thường được sử dụng trong các hệ thống kiểm
tra mà quét phát hiện các khuyết tật hoặc trong các bộ đếm. Ảnh

nhị phân cũng thuận tiện khi định vị trí một đối tượng để nắm bắt
.
• Methods for computing 3D information.
Các chức năng này rất hữu ích để lập bản đồ và nội địa hoá
hoặc với nhiều quan góc nhìn từ một máy ảnh.
• Math routines for image processing, computer vision, and image
interpretation.
OpenCV bao gồm các thuật toán toán học thường được sử
dụng trong đại số tuyến tính, thống kê, và hình học tính toán.
• Graphics.
Các interface này cho phép bạn viết văn bản và vẽ trên hình
ảnh. Ngoài ra, các chức năng này rất hữu ích cho việc ghi nhãn
và đánh dấu . Ví dụ, nếu bạn viết một chương trình phát hiện đối
tượng, nó rất hữu ích để nhãn hình ảnh với kích cỡ và vị trí của
họ.
• GUI methods
OpenCV bao gồm các interface windown riêng của nó. Trong
khi đây là những hạn chế so với những gì có thể được thực hiện
trên các nền tảng khác, họ cung cấp một đơn giản, đa nền tảng
API để hiển thị hình ảnh, chấp nhận đầu vào người dùng thông
4
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
qua con chuột hoặc bàn phím, và thực hiện kiểm soát thanh
trượt .
• Datastructures and algorithms
Với các interface, bạn có thể thực hiệu quả hơn các việc như:
tìm kiếm, lưu, và thao tác các danh sách lớn, bộ sưu, đồ thị và
cây .
• Data persistence
Những phương pháp này cung cấp giao diện thuận tiện để lưu

trữ các loại dữ liệu vào ổ lưu trữ và lấy chúng sau này .
1.1.2. Tổ chức
Chức năng OpenCV được chứa trong một số module:
• CXCORE chứa các định nghĩa kiểu dữ liệu cơ bản. Ví dụ, cấu
trúc dữ liệu điểm cho hình ảnh, hình chữ nhật và được quy định
tại cxtypes.h.
• CV bao gồm xử lý hình ảnh và các phương pháp hiệu chỉnh máy
ảnh. Các chức năng tính toán hình học cũng nằm ở đây.
• CVAUX được mô tả trong tài liệu hướng dẫn của OpenCV có
chứa mã thử nghiệm và thực nghiệm.Tuy nhiên, các giao diện
đơn giản nhất để nhận dạng khuôn mặt trong mô-đun này.
• ML chứa machine-learning interfaces.
• Các chức năng còn lại được chứa trong HighGUI và
CVCAM. Cả hai đều nằm trong một thư mục có tên là
"otherlibs. Nó chứa các cửa sổ đa nền tảng, đa chức năng.
• CVCAM chứa các giao diện để truy cập video thông qua DirectX
trên nền tảng Windows 32-bit. Tuy nhiên, HighGUI cũng chứa
các giao diện video.
1.2. Cài đặt OpenCV
1.2.1. Cài đặt cơ bản
OpenCV cho Linux hoặc MacOSX là các bản đóng gói như là
một kho lưu trữ mã nguồn. Bạn sẽ cần phải xây dựng các thư viện
5
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
tĩnh và thư viện chia sẻ đối tượng. Bạn có thể xây dựng một RPM
đầu tiên, và cài đặt từ đó, hoặc biên dịch và cài đặt nó trực tiếp.
Với Windows thì được đóng gói như là một thực thi cài đặt
OpenCV và bạn cần chạy nó. Nó đặt các file OpenCV vào một thư
mục tùy bạn chọn, thay đổi đường dẫn hệ thống của bạn để có thể
include những chương trình OpenCV.

1.2.2. Tùy chỉnh khi cài đặt Windows
Kể từ khi OpenCV là một bộ công cụ nhà phát triển, không phải
là một chương trình, bạn có thể muốn xác định vị trí nó ở đâu đó
khác hơn so với thư mục Program Files của bạn. Nếu bạn thích để
xác định vị trí nó ở nơi khác, quyết định rằng trước khi bạn chạy
trình cài đặt, và nhập vào vị trí đó khi được hỏi.
Bạn có thể thay đổi các biến PATH hệ thống của bạn bao gồm vị
trí của họ, hoặc bạn có thể di chuyển chúng, sau khi cài đặt, từ thư
mục "bin" của OpenCV vào thư mục SYSTEM_ROOT của bạn.
Nếu bạn muốn di chuyển các file dll, nhưng không chắc chắn thư
mục SYSTEM_ROOT của bạn, bạn có thể xác định vị trí nó bằng
cách chạy các tiện ích có sẵn ở www.cognotics.com/utilities.
Nếu bạn muốn thay đổi PATH, chứ không phải là di chuyển các
fiel dll, bạn có thể cài đặt làm điều đó cho bạn bằng cách chọn hộp
kiểm tra "Thêm thư mục bin vào PATH."
1.2.3. Sau khi cài đặt
OpenCV chứa nhiều thư mục con. Các tài liệu thư mục chứa tài
liệu html cho tất cả các chức năng và kiểu dữ liệu OpenCV.
Các tập tin tiêu đề bạn sẽ cần phải bao gồm khi bạn biên dịch
chương trình sử dụng OpenCV được phân phối giữa các mô-đun
OpenCV.
Trên cả hai Linux và Windows, bạn có thể xác định vị trí các tiêu
đề bằng cách tìm kiếm thư mục cài đặt và thư mục con cho tên tập
tin phù hợp với mô hình *. h, *. HPP.
1.3. Lập trình với OpenCV: Một số vấn đề cơ bản
1.3.1. Về tiêu đề và thư viện
6
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
Hầu hết các chương trình OpenCV cần bao gồm cv.h và
highgui.h. Sau đó, nhận diện khuôn mặt, chúng tôi cũng sẽ bao gồm

cvaux.h. Các tập tin tiêu đề còn lại được bao gồm bởi những tiêu đề
cấp cao nhất.
Mối liên kết của bạn sẽ cần cả hai con đường thư viện và tên của
các thư viện tĩnh để sử dụng. Các thư viện tĩnh, bạn cần phải liên
kết với file thư viện cxcore.lib, cv.lib, và highgui.lib. Sau đó, nhận
diện khuôn mặt, bạn cũng sẽ liên kết cvaux.lib. Đây là những file
trong thư mục "lib" của OpenCV.
1.3.2. Đọc và Ghi ảnh
Hình ảnh I / O dễ dàng với OpenCV.Chương trình dưới đây là để
đọc một hình ảnh từ tập tin và viết nó như là một tập tin thứ hai,
trong một định dạng nén khác nhau .
o // ImageIO.c
o // Example showing how to read and write images
o #include "cv.h"
o #include "highgui.h"
o #include <stdio.h>
o int main(int argc, char** argv)
o {
o IplImage * pInpImg = 0;
o // Load an image from file
o pInpImg = cvLoadImage("my_image.jpg",
CV_LOAD_IMAGE_UNCHANGED);
o if(!pInpImg)
o {
o fprintf(stderr, "failed to load input image\n");
o return -1;
o }
o // Write the image to a file with a different name,
o // using a different image format -- .png instead of .jpg
o if( !cvSaveImage("my_image_copy.png", pInpImg) )

7
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
o {
o fprintf(stderr, "failed to write image file\n");
o }
o // Remember to free image memory after using it!
o cvReleaseImage(&pInpImg);
o return 0;
o }
• Để đọc một tập tin hình ảnh, chỉ cần gọi cvLoadImage (), và
truyền vào trong hàm đường dẫn fle.OpenCV hỗ trợ các định
dạng hình ảnh phổ biến nhất, bao gồm JPEG, PNG, và BMP. Bạn
không cần phải cung cấp thông tin định dạng. cvLoadImage ()
xác định định dạng tập tin bằng cách đọc phần đầu tập tin.
• Để viết một hình ảnh tập tin, hãy gọi cvSaveImage (). Chức năng
này quyết định định dạng tập tin để sử dụng từ phần mở rộng tập
tin.
• Cả hai cvLoadImage () và cvSaveImage () trong module
HighGUI.
1.3.3. Live Video nhập vào
o // Capture.c
o // Example showing how to connect to a webcam and capture
o // video frames
o #include "stdio.h"
o #include "string.h"
o #include "cv.h"
o #include "highgui.h"
o int main(int argc, char ** argv)
o {
o CvCapture * pCapture = 0;

o IplImage * pVideoFrame = 0;
o int i;
o char filename[50];
8
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
o // Initialize video capture
o pCapture = cvCaptureFromCAM( CV_CAP_ANY );
o if( !pCapture )
o {
o fprintf(stderr, "failed to initialize video capture\n");
o return -1;
o }
o // Capture three video frames and write them as files
o for(i=0; i<3; i++)
o {
o pVideoFrame = cvQueryFrame( pCapture );
o if( !pVideoFrame )
o {
o fprintf(stderr, "failed to get a video frame\n");
o }
o // Write the captured video frame as an image file
o sprintf(filename, "VideoFrame%d.jpg", i+1);
o if( !cvSaveImage(filename, pVideoFrame) )
o {
o fprintf(stderr, "failed to write image file %s\n", filename);
o }
o // IMPORTANT: Don't release or modify the image returned
o // from cvQueryFrame() !
o }
o // Terminate video capture and free capture resources

o cvReleaseCapture( &pCapture );
o return 0;
o }
• Giao diện chụp được khởi tạo bằng cách gọi
cvCaptureFromCAM(). Chức năng này trả về một con trỏ đến
một cấu trúc CvCapture. Bạn sẽ lưu trữ con trỏ để sử dụng
cvQueryFrame () để lấy frame.
9
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
• Khi bạn hoàn tất bằng cách sử dụng đầu vào video, gọi
cvReleaseCapture() để giải phóng tài nguyên. Với
cvReleaseImage (), bạn thông qua địa chỉ của con trỏ CvCapture
để cvReleaseCapture ().
• Ảnh (IplImage) bạn nhận được từ cvQueryFrame()! Nếu bạn cần
phải sửa đổi dữ liệu hình ảnh, tạo một bản sao để làm việc với:
//Sao chép các khung hình video:
IplImage * pImgToChange = cvCloneImage (pVideoFrame);
/ / Chèn mã xử lý hình ảnh của bạn ở đây ... / / sao chép sau
khi sử dụng cvReleaseImage (& pImgToChange );
1.3.4. Chuyển đổi Color
o // ConvertToGray.c
o // Example showing how to convert an image from color
o // to grayscale
o #include "stdio.h"
o #include "string.h"
o #include "cv.h"
o #include "highgui.h"
o int main(int argc, char** argv)
o {
o IplImage * pRGBImg = 0;

o IplImage * pGrayImg = 0;
o // Load the RGB image from file
o pRGBImg = cvLoadImage("my_image.jpg",
CV_LOAD_IMAGE_UNCHANGED);
o if(!pRGBImg)
o {
o fprintf(stderr, "failed to load input image\n");
o return -1;
o }
o // Allocate the grayscale image
o pGrayImg = cvCreateImage
10
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
o ( cvSize(pRGBImg->width, pRGBImg->height),
pRGBImg->depth, 1 );
o // Convert it to grayscale
o cvCvtColor(pRGBImg, pGrayImg, CV_RGB2GRAY);
o // Write the grayscale image to a file
o if( !cvSaveImage("my_image_gray.jpg", pGrayImg) )
o {
o fprintf(stderr, "failed to write image file\n");
o }
o // Free image memory
o cvReleaseImage(&pRGBImg);
o cvReleaseImage(&pGrayImg);
o return 0;
o }
Lưu ý rằng chức năng chuyển đổi, cvCvtColor (), yêu cầu hai
hình ảnh trong danh sách đầu vào của nó. Đầu tiên, pRGBImg, là
hình ảnh nguồn. Thứ hai, pGrayImg, là hình ảnh đích. Nó sẽ chứa

kết quả chuyển đổi khi cvCvtColor () trả về.
1.3.5. OpenCV Iplimage.
OpenCV lưu trữ hình ảnh như là một cấu trúc C,
IplImage. IPL là viết tắt của Thư viện xử lý hình ảnh.
Các kiểu dữ liệu IplImage được định nghĩa trong
CXCORE. Ngoài dữ liệu pixel liệu, nó có chứa một số lĩnh vực mô
tả, gọi chung là Header Image. Chúng bao gồm
• Chiều rộng - chiều rộng hình ảnh theo pixel.
• Chiều cao – hình ảnh chiều cao tính bằng pixel.
• Chiều sâu - một trong những hằng số được xác định trước
cho biết số bit cho mỗi điểm ảnh trên một kênh
• nChannels - số lượng của các kênh dữ liệu (1-4). Mỗi kênh
có chứa một loại dữ liệu pixel.Ví dụ, hình ảnh RGB có ba
kênh màu đỏ, màu xanh lá cây, và cường độ màu xanh.
1.3.6. Truy cập giá trị Pixel
11
Xử lý ảnh Lê Xuân Bách-Phạm Kiên Giang-Nguyễn Đình Nam-Đồng Thị Tâm
Nó có thể tạo ra nhiều loại chức năng sử dụng OpenCV mà
không trực tiếp truy cập vào các dữ liệu pixel liệu. Ví dụ, các
chương trình nhận diện khuôn mặt, theo dõi, và công nhận không
bao giờ thao tác dữ liệu pixel liệu trực tiếp. Tuy nhiên, nếu bạn viết
các thuật toán xử lý hình ảnh của riêng bạn, bạn có thể cần truy cập
vào các giá trị pixel liệu. Dưới đây là hai cách để làm điều đó:
 Pixel truy cập đơn giản
• Cách dễ nhất để đọc điểm ảnh cá nhân với cvGet2D ():
CvScalar cvGet2D (const CvArr *, int row, int col);Chức
năng này có ba thông số: một con trỏ đến một thùng chứa dữ
liệu (CVArr *) và mảng chỉ số hàng và vị trí cột. Các thùng
chứa dữ liệu có thể là một cấu trúc IplImage. Hàng trên cùng
của điểm ảnh là hàng = 0, và dưới cùng là = chiều cao-1 hàng.

• CvGet2D () chức năng trả về một cấu trúc C, CvScalar, được
định nghĩa là:
CvScalar typedef struct
{
double val [4];
}
CvScalar;
• Các giá trị pixel cho mỗi kênh trong val [i]. Đối với màu xám
hình ảnh, val [0] chứa độ sáng điểm ảnh. Ba giá trị khác được
thiết lập là 0. Đối với một kênh ba, BGR hình ảnh, màu xanh
= val [0], xanh lá cây = val [1], và màu đỏ = val [2].
• Các chức năng bổ sung, cvSet2D () cho phép bạn chỉnh sửa
các giá trị pixel. Đó là định nghĩa: cvSet2D khoảng trống
(CvArr *, int row, int col, CvScalar);
 Truy cập nhanh Pixel
• Mặc dù cvGet2D () và cvSet2D () là dễ sử dụng, nếu bạn
muốn truy cập nhiều hơn một vài giá trị pixel, và các vấn đề
hiệu suất, bạn sẽ muốn đọc các giá trị trực tiếp từ bộ đệm dữ
liệu thô, IplImage.imageData.
• Đối với lý do hiệu suất, dữ liệu pixel được liên kết, và đệm
nếu cần thiết, sao cho mỗi hàng bắt đầu vào ngày một nhiều
12

×