Tải bản đầy đủ (.doc) (39 trang)

TÌM HIỂU MỘT SỐ THUẬT TOÁN VÀ XÂY DỰNG CHƯƠNG TRÌNH XỬ LÝ ẢNH CƠ BẢN SỬ DỤNG OPENCV

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 (1.62 MB, 39 trang )

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN
Tel. (84-511) 736 949, Fax. (84-511) 842 771
Website: itf.ud.edu.vn, E-mail:

BÁO CÁO THỰC TẬP TỐT NGHIỆP
NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH : 05115

ĐỀ TÀI :
TÌM HIỂU MỘT SỐ THUẬT TOÁN VÀ XÂY DỰNG
CHƯƠNG TRÌNH XỬ LÝ ẢNH CƠ BẢN SỬ DỤNG OPENCV
SINH VIÊN : NGUYỄN NGỌC SANG
LỚP
: 08T2
ĐƠN VỊ
: TRUNG TÂM NGHIÊN CỨU
ĐIỆN TỬ - TIN HỌC- TỰ ĐỘNG HÓA
MIỀN TRUNG
CBHD
:

ĐÀ NẴNG, 02/2012


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

ii



LỜI CẢM ƠN
Sau hơn hai tháng thực tập và học tập tại Trung Tâm, được sự giúp đỡ tận tình
của các anh chị trong Trung Tâm, em đã có một kiến thức thực tế quan trọng góp
phần xác định được công việc của mình trong tương lai và cơ bản hoàn thành đề tài
“tìm hiểu về các thuật toán xử lý ảnh trong OpenCV ”. Để đạt được kết quả này, em
đã nỗ lực hết sức đồng thời cũng nhận được rất nhiều sự quan tâm, giúp đỡ, ủng hộ
của các thầy cô, bạn bè và gia đình.
Trước hết, em xin gởi lời cảm ơn chân thành đến Khoa Công nghệ Thông tin,
trường Đại học Khoa học Tự nhiên đã tạo điều kiện cho em được thực tập tại “Trung
Tâm nghiên cứu Điện Tử Tin Học, Tự Động Hóa”.
Em cũng xin cảm ơn tất cả các anh chị, cô chú trong trung tâm, đặt biệt là thầy
Ngô Văn Sỹ nguyên là giám đốc của trung tâm đã tận tình giúp đỡ tạo điều kiện cho
em hoàn thành chiến thực tập này.
Và con cũng xin chân thành cảm ơn gia đình đã luôn động viên, tạo điều kiện
tốt nhất cho con học tập và hoàn thành tốt vẫn không tránh khỏi sai sót. Kính mong
sự cảm thông và đóng góp ý kiến từ các thầy cô và các bạn.
Đà Nẵng, Ngày 2 tháng 02 năm 2013
Sinh viên thực hiện
Nguyễn Ngọc Sang

MỤC LỤC
SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

MỞ ĐẦU...........................................................................................................1
a.
b.

c.
d.

Giới thiệu về đơn vị đến thực tập............................................................................1
Giới thiệu bối cảnh của đề tài. ................................................................................2
Mục đích và ý nghĩa.................................................................................................2
Giới thiệu những công việc được giao....................................................................2

CHƯƠNG 1.......................................................................................................4
GIỚI THIỆU VỀ OPENCV..............................................................................4
1.

2.

3.

Giới thiệu tổng quan................................................................................................4
1.1. Khái niệm...........................................................................................................4
1.2. Lịch sử phát triển...............................................................................................4
1.3. Ứng dụng ...........................................................................................................5
Hướng dẫn cài đặt....................................................................................................5
2.1. Chuẩn bị.............................................................................................................5
2.2. Cách thực hiện....................................................................................................5
Chương trình đầu tiên............................................................................................12
3.1. Chương trình ...................................................................................................12
3.2. Giải thích..........................................................................................................12
3.3. Kết quả ........................................................................................................13

CHƯƠNG 2.....................................................................................................14
LẬP TRÌNH VỚI OPENCV...........................................................................14

1.

2.
3.
4.

5.
6.

Các kiểu dữ liệu trong OpenCV............................................................................14
1.1. OpenCV Iplimage............................................................................................15
1.2. OpenCV Mat....................................................................................................15
Đọc và ghi ảnh.......................................................................................................16
Video và Camera...................................................................................................17
HighGui..................................................................................................................18
4.1. Giới thiệu.........................................................................................................18
4.2. Các hàm hiển thị..............................................................................................18
.4.2.1. Load ảnh từ Disk .......................................................................................18
.4.2.2. Tạo một window để chứa ảnh .....................................................................19
.4.2.3. Hiện thị ảnh lên window..............................................................................19
.4.2.4. Một số hàm cần chú ý..................................................................................19
4.3. Xử lý sự kiện....................................................................................................19
Sliders, Trackbars, and Switches..........................................................................21
Truy cập giá trị Pixel.............................................................................................21
6.1. Pixel truy cập đơn giản ...................................................................................21
6.2. Truy cập nhanh Pixel ......................................................................................22

CHƯƠNG 3.....................................................................................................23
XỬ LÝ ẢNH TRONG OPENCV .................................................................23
1.

2.
3.
4.

Làm trơn ảnh(Smoothing).....................................................................................23
Phân ngưỡng (Threshold)......................................................................................24
Flood Fill................................................................................................................24
Image Pyramids.....................................................................................................25

SVTH : Nguyễn Ngọc Sang

iii


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

5.

Resize.....................................................................................................................25

CHƯƠNG 4.....................................................................................................26
TRIỂN KHAI CHƯƠNG TRÌNH DEMO......................................................26
1.
2.
3.
4.

Mô tả .....................................................................................................................26
Chức năng của chương trình .................................................................................26
Giao diện chính......................................................................................................26

Chi tiết chương trình..............................................................................................26
4.1. Nhận dữ liệu từ camera ...................................................................................26
4.2. Ghi video..........................................................................................................27
4.3. Các hàm đã dùng..............................................................................................27
.4.3.1. Resize...........................................................................................................27
.4.3.2. Smooth.........................................................................................................28
.4.3.3. Phân ngưỡng................................................................................................29
.4.3.4. Histogram....................................................................................................30
.4.3.5. Laplacian.....................................................................................................31

KẾT LUẬN.......................................................................................................1

SVTH : Nguyễn Ngọc Sang

iv


MỞ ĐẦU
a. Giới thiệu về đơn vị đến thực tập
1) Giới thiệu tổng quan
- Tên doanh nghiệp: Trung tâm nghiên cứu điện tử, tin học, tự động hóa Miền
Trung.
- Tên tiếng Anh: Vietnam Research Institude of Electronics, Information and
Automation - Brand in Central Region.
- Tên viết tắt: VIELINA-CR
- Trụ sở: Trụ sở chính của Trung tâm : Tầng 2 – Nhà D, 99 Tô Hiến Thành, Quận
Sơn Trà, Tp Đà Nẵng.
- Cơ quan ra quyết định thành lập: Viện NC Điện tử, Tin học, Tự động hóa.
- Cơ quan chủ quản: Viện NC Điện tử, Tin học, Tự động hóa.
2) Quá trình hình thành phát triển

Trung tâm Điện tử, Tin học,Tự động hóa Miền Trung được thành lập theo
Quyết định số: /VĐT-TC ngày 21/02/2012 của Viện trưởng Viện NC Điện tử, Tin
học, Tự động hoá. Trung tâm có các chức năng nhiệm vụ như sau:
-

Thực hiện nghiên cứu khoa học và công nghệ các vấn đề do thực tiễn đặt ra
trong lĩnh vực Điện tử, Tin học, Tự động hóa và chuyển giao các kết quả
nghiên cứu này vào thực tế sản xuất.

-

Thực hiện bảo trì, bảo dưỡng, sửa chữa, tư vấn kỹ thuật các thiết bị điện tử
chuyên dụng, các thiết bị tự động trong công nghiệp nói riêng và trong các
ngành kinh tế quốc dân nói chung.

-

Đào tạo phổ cập, đào tạo lại cho các đối tượng có nhu cầu và các cán bộ khoa
học kỹ thuật tại các doanh nghiệp về chuyên ngành Công nghệ thông tin và
Tự động hóa.
3) Biên chế
Trung tâm hiện có 05 Cán bộ nghiên cứu trong đó 01 Tiến sĩ Điện tử - Viễn
thông, 02 Thạc sĩ Tự động hóa, 01 Cử nhân Tin học, 01 Cử nhân Kinh tế
Ngoài ra để tận dụng tối đa nguồn lực trí tuệ, phát huy hiệu quả hoạt động
nghiên cứu, đào tạo và kinh doanh, Trung tâm còn mời một số cộng tác viên thường
xuyên: 05 TS là chuyên gia hàng đầu trong các lĩnh vực Điện tử, Tin học, Tự động
hoá trong khu vực Miền Trung và Tây Nguyên.
4) Diện tích làm việc:

1



Diện tích đang sử dụng gồm 01 phòng khoảng 50m 2 ở tầng 2 nhà D Trường Cao
Đẳng Nghề Đà Nẵng, và 02 phòng khoảng 70m2 tầng 3 nhà cho thuê.

b. Giới thiệu bối cảnh của đề tài.

Sắp tới một số tuyến đường bộ cao tốc đầu tiên sẽ đưa vào khai thác. Đây là
những tuyến đường giao thông hiện đại có lưu lượng thông xe lớn tốc độ nhanh, chắc
chắn sẽ đóng góp tích cực vào phát triển kinh tế xã hội nhưng đồng thời cũng đặt ra
vấn đề lớn về quản lý, vận hành khai thác chúng. Công nghệ ITS đã được ứng dụng ở
nhiều nước tiến tiến trên thế giới và khu vực với nhiều ứng dụng tiện ích chủ yếu
gồm:
• Tổ chức mạng lưới thông tin giữa các trung tâm điều hành giao thông;
• Thông tin điều hành và kiểm soát giao thông trên đường
• Thu phí không dừng (ETC)
• Kiểm soát xe tải trọng nặng
• Thông tin về tắc nghẽn và sự cố;
• Thông tin về thời tiết và tình trạng mặt đường;
• Thông tin về thời gian đi lại
• Hỗ trợ thông tin về xe Bus
• Cung cấp thông tin về nơi đỗ xe và thu phí điểm đỗ xe.
Tại trung tâm, ngoài những đề tài cấp bộ nghiên cứu, thiết kế chế tạo micro
inverter còn có những dự án như dự án xây dựng hệ thống bãi giữ xe của trung tâm
thành phố Đà Nẵng ,dự án nghiên cứu bộ thí nghiệm điện tử …Thì đề tài mới được
đề xuất là ứng dụng xử lý vào xây dựng hệ thống giao thông. Do đó ,em được giao
cho đề tài để nghiên cứu : “Tìm hiểu một số thuật toán và xây dựng chương trình xử
lý ảnh cơ bản sử dụng OpenCV”.

c. Mục đích và ý nghĩa.

• Cung cấp những kiến thức cơ bản về xử lý ảnh .
• Nâng cao chất lượng ảnh .
• Với kiến thức về OpenCV và xử lý ảnh tạo tiền đề cho quá trình xây dựng hệ
thống quản lý giám sát giao thông .

d. Giới thiệu những công việc được giao.
Với đề tài trên ta cần nghiên cứu:
• Tìm hiểu về OpenCV
• Tìm hiểu về xử lý ảnh trong OpenCV
• Tìm hiểu thuật toán xử lý ảnh về tăng cường độ phân giải ảnh


Xây dựng chương trình

2


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Nội dung bài báo cáo được trình bày gồm các phần chính như sau:
MỞ ĐẦU
Chương 1: GIỚI THIỆU VỀ OPENCV
Chương 2: LẬP TRÌNH VỚI OPENCV
Chương 3: XỬ LÝ ẢNH TRONG OPENCV
Chương 4: TRIỂN KHAI CHƯƠNG TRÌNH DEMO
KẾT LUẬN

SVTH : Nguyễn Ngọc Sang

3



Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

4

CHƯƠNG 1

GIỚI THIỆU VỀ OPENCV
1. Giới thiệu tổng quan
1.1.Khái niệm

OpenCV là open source (xem ) computer vision library
có sẵn ở Thư viện này được viết trong
C và C++ và chạy dưới Linux, Windows và Mac OS X. Có phát triển tích hợp với
các giao diện cho Python, Ruby, Matlab, và các ngôn ngữ khác.
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.

1.2.Lịch sử phát triển

OpenCV phát triển từ một nghiên cứu Intel khởi xướng cho các ứng dụng tận
dụng CPU tối đa. Hướng đến kết quả này, Intel khởi trương nhiều dự án gồm realtime ray tracing và 3D display walls. Một trong những người làm việc cho Intel ở
thời điểm đó đang thăm các trường đại học và nhận thấy rằng một số trường học đỉnh
cao, chẳng hạn MIT Media Lab, có cơ sở phát triển và họ đã bộ mã đến sinh viên và
mà cho mỗi sinh viên phát triễn ứng dụng của mình dựa trên nền tảng đó.
Do đó, OpenCV được hiểu như một cách làm hạ tầng sẵn có. Với hỗ trợ của
Intel’s Performance Library Team, OpenCV bắt đầu với lõi của các tiên chuẩn mã
và thuật toán được thực hiện được gửi đến các thành viên của Intel’s Russian library

team.
Chủ chốt trong các nhóm người Nga là Vadim Pisarevsky, người quản lý, mã,
và tối ưu nhiều trong OpenCV và người có nỗ lực với OpenCV. Cùng với anh, Victor
Eruhimov hỗ trợ phát triển cấu trúc ban đầu, và Valery Kuriakin điều hành Russian
lab và hỗ trợ lớn cho sự phát triển này. Mục đích cho OpenCV ở lúc bắt đầu:
• Phát triển mã nguồn không chỉ mở mà tối ưu ,Không phát triển lại cái đã có
trước
• Phổ biến kiến thức cho các thành viên, chương trình đọc dể hiểu và khả
chuyển
• Các ứng dụng thương mại dựa trên vision cao cấp bởi mã khả chuyển, thực
hiện tối ưu sẵn có miễn phí—với một bản quyền mà không đòi hỏi các ứng dụng
thương mại là mở hay miễn phí.
Nhưng mục tiêu này tạo thành “lý do” cho phép các ứng dụng gia tăng nhu
cầu cho các processor nhanh. Dẫn đến nâng cấp các processor nhanh hơn mà tạo ra
nhu cầu cho Intel bán các extra software. Đó là lý do mã mở và miễn phí này lại phát
triển từ một công ty software.
Bây giờ có xấp xỉ hai triệu download của OpenCV, và số này tăng trung bình
26,000 downloads một tháng.User group bây giờ gần đến 20,000 members. OpenCV
nhận nhiều hợp tác bởi nhiều người dùng và trung tâm bên ngoài công ty. Ngày nay,
OpenCV là một lĩnh vực tích cực ở vài tổ chức, do mong muốn thấy nhiều cập
SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

5

nhâthtrong hiệu chỉnh nhiều camera, nhận biết độ sâu, các phương pháp trộn vision
với các laser range finder, và nhận biết mẫu tốt hơn cũng như nhiều hỗ trợ cho các
nhu cầu robot


1.3.Ứng dụng

Khi alpha release của nó January 1999, OpenCV đã được dùng nhiều trong
các ứng dụng, sản phẩm, và nỗ lực nghiên cứu. Các ứng dụng này gồm nối ảnh với
nhau trong bản đồ vệ tinh và web, sắp xếp ảnh quét, giảm nhiễu ảnh y học, phân tích
đối tượng, an ninh và các hệ dò xâm nhập, các hệ giám sát tự động và an toàn, các hệ
thẩm tra sản xuất, hiện chỉnh camera, các ứng dụng quân sự, và các phương tiện trên
không, dưới đất, và dưới nước không người. Nó được dùng trong nhận diện âm thành
và âm nhạc, nơi kỹ thuật nhận biết vision được áp dụng với các ảnh spectrogram âm
thanh. OpenCV là phần quan trọng ứng dụng trong robot.

2. Hướng dẫn cài đặt
OpenCV là thư viện mã nguồn mở về Computer Vision do Intel thiết kế, cung
cấp các hàm, lớp ứng dụng các thuật toán về xử lý ảnh với ngôn ngữ C/C++.Dưới
đây là cách cài đặt bộ thư viện OpenCV 2.4.3 với công cụ Visual Studio 2010.

2.1.Chuẩn bị

Để cài đặt và sử dụng OpenCV với Visual Studio 2010 cần phải download
các phần sau:
• Bộ OpenCV 2.4.3 bạn có thể download
( />• Bộ Visual Studio 2010

2.2.Cách thực hiện

Sau khi download về ta tiến hành giải nén ở thư mục “C:/opencv” .Bạn có thể
thay đổi nếu muốn nhưng lưu ý cần phải nhớ vì sẽ sử dụng ở các phần tiếp theo
Chọn đường dẫn


SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

6

Giải nén

Sau khi giải nén xong ,t hay đổi giá trị biến “Path” trong máy tính của bạn
Click chuột phải vào máy tính chọn properties, sau đó chọn tab “advanced” và
click “Environment Variables”

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Chọn edit để thêm vào

SVTH : Nguyễn Ngọc Sang

7


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Thêm vào Path Variable:
C:\opencv\opencv\build\x86\vc10\bin
C:\opencv\opencv\build\common\tbb\ia32\vc10


SVTH : Nguyễn Ngọc Sang

8


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Tạo 1 project C++ trong visual studio ,click chuột phải chọn properties

SVTH : Nguyễn Ngọc Sang

9


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Chọn C/C++ vài edit the Additional Include Directories.thêm vào
C:\opencv\opencv\build\include\opencv
C:\opencv\opencv\build\include

Tiếp tục chọn linker và chọn Additional Library Directories,
SVTH : Nguyễn Ngọc Sang

10


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

11


Thêm vào C:\opencv\opencv\build\x86\vc10\lib

Nhấp chuột vào dấu cộng chọn input ,chon additional Dependencies thêm vào có thư
viện
opencv_core243d.lib
opencv_imgproc243d.lib
opencv_highgui243d.lib
opencv_ml243d.lib
opencv_video243d.lib
opencv_features2d243d.lib
opencv_calib3d243d.lib
opencv_objdetect243d.lib
opencv_contrib243d.lib
opencv_legacy243d.lib
opencv_flann243d.lib

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Đã hoàn tất quá trình cài đặt

3. Chương trình đầu tiên
3.1.Chương trình
#include "stdafx.h"
#include <highgui.h>
#include <cv.h>
int main( ) {

IplImage* img = cvLoadImage( "C:/lena.png");
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE );
cvShowImage( "Example1", img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow( "Example1" );
return 0;
}

3.2.Giải thích

SVTH : Nguyễn Ngọc Sang

12


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

Đây là chương trình đọc ảnh từ "C:/lena.png"
các lệnh sẽ được giải thích ở chương sau

3.3.Kết quả

SVTH : Nguyễn Ngọc Sang

và hiển thị ra màn hình

13



Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

14

CHƯƠNG 2

LẬP TRÌNH VỚI OPENCV
1. Các kiểu dữ liệu trong OpenCV
OpenCV có vài data type cơ sở Bạn có thể xem xét chi tiết các structure mô tả
như sau (cũng như các structure khác) trong types_c.h header file, mà ở
.../OpenCV/core/include directory của cài cặt OpenCV.
Structure
Chứa
Represents
CvPoint
int x, y
Point in image
CvPoint2D32f
float x, y
Points in ℜ2
CvPoint3D32f

float x, y, z

Points in ℜ3

CvSize
CvRect

int width, height

int x, y, width,
height
double val[4]

Size of image
Portion of image

CvScalar

RGBA value

• CvPoint là structure đơn giản với hai integer members, x và y
• CvPoint2D32f và CvPoint3D32f. Cả 2 có hai members x và y, mà cả hai là
các số float, CvPoint3D32f chứa phần tử thứ ba z.
• CvSize các phần tử của nó là width và height, mà cả hai là integer. Nếu bạn
muốn các số float, dùng CvSize2D32f.
• CvRect sự kết hợp CvPoint và CvSize; nó chứa bốn member: x, y, width, và
height.
• CvScalar, mà là một tập 4 số double val[4].
Tất cả những data type này có các contructor,các contructor này đều có tên gần
giống với đều datatype nhưng không inhoa chữ đầu tiên .
Giả sử bạn muốn vẽ một rectangle trắng giữa (5, 10) và (20, 30); bạn có thể đơn giản
gọi:
cvRectangle(
myImg,
cvPoint(5,10),
cvPoint(20,30),
SVTH : Nguyễn Ngọc Sang



Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

15

cvScalar(255,255,255)
);

1.1.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.2.OpenCV Mat

Trong OpenCV không có vector , khái niệm của một matrix trong OpenCV
là có phần trừu tượng hơn khái niệm ta học trong lớp đại số tuyền tính. Về cụ thể,
các phần tử của một matrix tự chúng không là các số đơn giản. Do đó, matrix có
thể gồm các 32-bit floats (CV_32FC1), của các unsigned integer 8-bit triplets
(CV_8UC3), hay vô số các element khác. Một element của CvMat không cần
thiết là một số đơn. Có thể biểu diễn nhiều giá trị cho một entry đơn trong matrix
cho phép ta làm nhiều thứ như biểu diễn nhiều channel màu trong một RGB

image. Các matrix có một width, height, type, step (chiều dài của một row theo
các byte, không ints hay floats), và một pointer đến một data array (và một vài
thứ mà ta chưa thể nói). Bạn có thể truy cập những members này trực tiếp bởi
referencing lại một pointer đến CvMat hay, cho một vài element phổ biến hơn,
bởi dùng các accessor function được cung cấp. Ví dụ, để lấy size của một matrix,
bạn có thể lấy thông tin bạn muốn một trong bởi gọi cvGetSize(CvMat*), mà trả
về một CvSize structure, hay bởi truy cập height và width độc lập với các
constructs như matrix->height và matrix->width.
typedef struct CvMat {
int type;
int step;
int* refcount; // cho dùng chỉ bên trong
union {
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data;
union {
int rows;
int height;
SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

16

};

union {
int cols;
int width;
};
} CvMat;
Phổ biến là dùng cvCreateMat(), nó là sự kết hợp của cvCreateMatHeader() và
cvCreateData(). cvCreateMatHeader() tạo CvMat không cấp memory cho data, trong
khi cvCreateData() handles cấp phát data. Đôi khi chỉ cvCreateMatHeader() được
đòi hỏi, một trong vì bạn đã cấp data cho vài nguyên nhân khác hay vì bạn chưa thực
sự cần cấp nó. Hàm thứ ba để dùng cvCloneMat(CvMat*), mà tạo matrix mới từ một
cái hiện có.Khi matrix không còn cần nữa, nó có thể được giải phóng bởi gọi
cvReleaseMat(CvMat**).

2. Đọc và ghi ảnh
Hình ảnh được lưu và hiển thị 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 .
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
int main(int argc, char** argv)
{
IplImage * pInpImg = 0;
// Load an image from file
pInpImg = cvLoadImage("my_image.jpg",
CV_LOAD_IMAGE_UNCHANGED);
if(!pInpImg)
{
fprintf(stderr, "failed to load input image\n");
return -1;

}
if( !cvSaveImage("my_image_copy.png", pInpImg) )
{
fprintf(stderr, "failed to write image file\n");
}
// Remember to free image memory after using it!
cvReleaseImage(&pInpImg);
return 0;
}

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

17

Để đọ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 .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.

3. Video và Camera
Làm việc với video trong OpenCV ta có các hàm hỗ trợ nhanh chóng dưới đây
là chương trình để hiển thị webcam
#include "stdio.h"
#include "string.h"

#include "cv.h"
#include "highgui.h"
int main(int argc, char ** argv)
{
CvCapture * pCapture = 0;
IplImage * pVideoFrame = 0;
int
i;
char
filename[50];
// Initialize video capture
pCapture = cvCaptureFromCAM( CV_CAP_ANY );
if( !pCapture )
{
fprintf(stderr, "failed to initialize video capture\n");
return -1;
}
// Capture three video frames and write them as files
for(i=0; i<3; i++)
{
pVideoFrame = cvQueryFrame( pCapture );
if( !pVideoFrame )
{
fprintf(stderr, "failed to get a video frame\n");
}
// Write the captured video frame as an image file
sprintf(filename, "VideoFrame%d.jpg", i+1);
if( !cvSaveImage(filename, pVideoFrame) )
{
fprintf(stderr, "failed to write image file %s\n", filename

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

18

}
// IMPORTANT: Don't release or modify the image retu
// from cvQueryFrame() !
}
// Terminate video capture and free capture resources
cvReleaseCapture( &pCapture );
return 0;
}
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.
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 );

4. HighGui
4.1.Giới thiệu


Các hàm trong OpenCV cho phép ta tương tác với operating system, file
system, và hardware chẳng hạn cameras được thu vào gọi là HighGUI (mà viết tắt
cho “high-level graphical user interface”). HighGUI cho phép ta mở windows,
display các images, đọc và viết các file liên quan graphic (cả images và video), và
handle đơn giản mouse, pointer, và keyboard events.HighGUI library trong OpenCV
có thể được chia thành ba phần: phần hardware, phần file system, và phần GUI
• Phần hardware được liên quan chính với các camera. Trong hầu hết hệ điều
hành, sự tương tác với camera là phức tạp. HighGUI cho phép một cách dễ
dàng để query camera và nhận image cuối từ camera.
• Phần file system được liên quan chính với loading và saving images. Khả
năng của bộ thư viện này là nó cho phép ta đọc video dùng cùng các phương
thức ta sẽ dùng để đọc camera.
• Phần thứ ba của HighGUI là window system (or GUI). Library cung cấp các
functions đơn giản mà sẽ cho phép ta mở một window và đưa image vào
window đó. Nó cũng cho phép ta thao tác với các sự kiện chuột bàn phím .

4.2.Các hàm hiển thị
.4.2.1.

Load ảnh từ Disk

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

19

Function: IplImage* cvLoadImage(const char* filename ,int iscolor =

CV_LOAD_IMAGE_COLOR);
- IplImage là một lớp cho phép chứa dữ lệu ảnh.
Const char* filename : tên file cần load.
int iscolor : là một trong các số sau
- CV_LOAD_IMAGE_COLOR : Load ảnh màu 8-bit ( mặc định)
- CV_LOAD_IMAGE_GRAYSCALE: Ảnh chuyển sang màu trắng đen
- CV_LOAD_IMAGE_ANYCOLOR : Load ảnh với màu như được lưu trữ
trong file.
- CV_LOAD_IMAGE_ANYDEPTH : cho phép load ảnh màu ngoài ảnh 8bit
- CV_LOAD_IMAGE_UNCHANGED : Load ảnh và không thay đổi ảnh.
Ví dụ: Để load một ảnh test.jpg và chuyển sang ảnh trắn đen ta cần viết :
IplImage * image = cvLoadImage ( “test.jpg”, CV_LOAD_IMAGE_GRAYSCALE);
.4.2.2.
Tạo một window để chứa ảnh
Function: int cvNamedWindow(const char* name, int flags =
CV_WINDOW_AUTOSIZE);
Const char* name : tiêu đề của window cần tạo.
Flags : set giá trị là CV_WINDOW_AUTOSIZE thì window tự đông lấy kích cỡ ảnh
, nếu muốn chỉnh kích cở tùy ý bạn set giát trị vè 0.
Chú ý : Nếu muốn chỉnh kích cỡ wndow bản có thể dùng hàm sau:
void cvResizeWindow(const char* name,int width,int height);
.4.2.3.
Hiện thị ảnh lên window
Function : void cvShowImage(const char* name, const CvArr* image);
Const char* name : tên của window hiện thị ảnh
Cost CvArr* image : ảnh cần hiện thị
.4.2.4.
Một số hàm cần chú ý
a/ Dịch chuyển window theo goc trên bên trái đến tọa đô (x,y)
void cvMoveWindow( const char* name, int x, int y );

const char* name : tên window cần di chuyển
b/ Đóng tấn cả các window và giải phóng bộ nhớ
void cvDestroyAllWindows( void );
c/ Hàm chờ cvWaitkey() : Hàm sẽ chờ cho tới khi có thao tác nhấn phím.
Ví dụ: while( 1 ) {if( cvWaitKey(100)==27 ) break;}
- Ví dụ trên là một vòng lặp vô tân dừng khi nhấn phím ESC. Mã số 27 ứng với
phím ESC trong
bản mã ASCII

4.3.Xử lý sự kiện

SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

20

Để xử lí thao tác chuột ta cần xây dựng một hàm callback đề OpenCv có thể
gọi về hệ thống khí có sự kiện chuột xảy ra.
Prototype hàm callback: void CvMouseCallback(int event,
int x,
int y,
int flags,
void* param);
Hàm này gồm năm thông số truyền vào:
• int event : lưu trữ xử kiện chuột là một trong các giá trị tương ứng trong bản
sau

Sự kiện

Giá trị tương ứng
CV_EVENT_MOUSEMOVE
0
CV_EVENT_LBUTTONDOWN
1
CV_EVENT_RBUTTONDOWN
2
CV_EVENT_MBUTTONDOWN
3
CV_EVENT_LBUTTONUP
4
CV_EVENT_RBUTTONUP
5
CV_EVENT_MBUTTONUP
6
CV_EVENT_LBUTTONDBLCLK
7
CV_EVENT_RBUTTONDBLCLK
8
CV_EVENT_MBUTTONDBLCLK
9
Bảng sự kiện1
Ví dụ : khi ta click trái chuột thì biến event sẽ mang giá trị là 1.
• Int x, int y : Lưu trữ tọa độ của chuột khi xày ra xử kiện
• Int flag : thông số cờ - thiết lập sự kiện kèm theo cùng với sự kiện chính ở biến
even.
Sự kiện
Giá trị tương ứng
CV_EVENT_FLAG_LBUTTON
1

CV_EVENT_FLAG_RBUTTON
2
CV_EVENT_FLAG_MBUTTON
4
CV_EVENT_FLAG_CTRLKEY
8
CV_EVENT_FLAG_SHIFTKEY
16
CV_EVENT_FLAG_ALTKEY
32
Bảng sự kiện1
Vídụ: Nếu ta ấn Shift + left click thì flag sẽ được set giá trị là
CV_EVENT_FLAG_SHIFTKEY tương ứng với giá trị trong bản trên
• Truyền vào biến cần thao tác thuộc các kiểu IplImage, …
Hàm đăng kí callback: void cvSetMouseCallback(const char*window_name,
SVTH : Nguyễn Ngọc Sang


Đề tài : Tìm hiểu một số thuật toán và xây dựng chương trình cơ bản xử lý ảnh sử dụng OpenCV

21

CvMouseCallback on_mouse,
void* param);
const char* window : tên windon cần bắt sự kiện chuột.
CvMouseCallback on_mouse : hàm callback đã được xây dựng bên trên

5. Sliders, Trackbars, and Switches
Trong HighGUI, các slider được gọi trackbars : là một thanh trượt mà ứng với
môt vị trí của con trượt(slider) cho ta một giá trị của hệ thống.. Đây là vì ban đầu của

chúng tập trung cho chọn frame cụ thể trong playback của một video. Hàm để tạo ra
Trackbar
int cvCreateTrackbar(
const char* trackbar_name,
const char* window_name,
int* value,
int count,
CvTrackbarCallback on_change
);

6. Truy cập giá trị Pixel
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à 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 đó:

6.1.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.
SVTH : Nguyễn Ngọc Sang


×