Upload
api-3707444
View
1.791
Download
6
Embed Size (px)
Citation preview
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 1
TỔNG QUAN VỀ THỊ GIÁC MÁY TÍNH
1. Giới thiệu về thị giác máy - Computer Vision
Thị giác máy là một lĩnh vực đã và đang phát triển mạnh mẽ trên thế giới
hiện nay. Khái niệm về thị giác máy – Computer Vision có liên quan tới nhiều
ngành học và có nhiều hướng nghiên cứu khác nhau. Kể từ những năm 70 của thế
kỷ 20 khi mà khả năng tính toán của các máy tính trở nên mạnh mẽ , nó có thể giải
quyết được những công việc cần tới tốc độ cao như xử lý các tập ảnh hay các đoạn
video thì thị giác máy được nhắc đến , nghiên cứu và phát triển cho đến ngày nay.
Thị giác máy là một lĩnh vực rất mới mẻ đối với các nhà nghiên cứu ở Việt
nam, nó chỉ mới xuất hiện gần đây ở trong các tổ chức quân đội và một số viện
nghiên cứu khác. Việc áp dụng thị giác máy vào các ứng dụng nghiên cứu khoa
học được coi là một khởi đầu cho chặng đường phát triển của thị giác máy ở các
trường đại học hiện nay.
1.1. Thế nào là thị giác máy
Thị giác máy bao gồm lý thuyết và các kỹ huật liên quan nhằm mục đích tạo
ra một hệ thống nhân tạo có thể nhận thông tin từ các hình ảnh thu được hoặc các
tập dữ liệu đa chiều.
Máy móc càng ngày càng thông minh, nó không chỉ thay con người làm
những công việc nặng nhọc và nhàm chán mà nó còn có một số khả năng bắt
chước động vật và con người. Một trong số những khả năng đó là nhận biết được
thế giới qua “mắt” của nó. Bằng việc kết hợp với các mô hình khác nữa như máy
học , mạng nơron … giúp cho chúng dần tiến tới một hệ thống nhân tạo có những
quyết định linh hoạt và chính xác hơn.
Lĩnh vực nghiên cứu của thị giác máy rất rộng, và đặc điểm chung là các bài
toán về thị giác máy đều không có một đề bài chung và cách giải quyết duy nhất.
Mỗi giải pháp giải quyết vấn đề được một kết quả nhất định cho những trường hợp
cụ thể.
Ta có thể thấy sự tương quan giữa thị giác máy với các lĩnh vực khác như
sau:
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 2
Hình 1. Mối quan hệ giữa thị giác máy với các ngành liên quan
1.2. Các ứng dụng của thị giác máy
Một số ứng dụng của thị giác máy vào các lĩnh vực được kể đến ở đây là:
- Điều khiển tiến trình (ví dụ: trong các robot công nghiệp, hay các thiết bị,
xe tự hành…).
- Phát hiện sự thay đổi (ví dụ: các thiết bị giám sát…).
- Tổ chức thông tin (ví dụ: chỉ số kho dữ liệu các ảnh hoặc chuỗi ảnh liên
tục…).
- Mô hình hoá đối tượng (ví dụ: quá trình kiểm tra trong môi trường công
nghiệp, xử lý ảnh trong y học).
- Tương tác (đóng vai trò làm đầu vào cho thiết bị trong quá trình tương tác
giữa người và máy).
1.3. Các thư viện thị giác máy mã nguồn mở Chúng ta có thể tận dụng những thành quả của cộng đồng mã nguồn mở để
áp dụng cho ứng dụng thị giác máy của mình. Hiện nay trên thế giới có rất nhiều
thư viện mã nguồn mở cho chúng ta sử dụng, cụ thể là:
- Intel OpenCV (http://sourceforge.net/projects/opencvlibrary).
- CMVision (http://www.cs.cmu.edu/~coral/minnow/platform.html).
- ImLib3D.
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 3
- Imalab.
- v.v…
2. Thư viện OpenCV
Có rất nhiều thư viện thị giác máy mã nguồn mở như đã giới thiệu ở trên,
mỗi thư viện có một nét riêng của nó mà chúng ta có thể khai thác. Ở đây tôi đặc
biệt nghiên cứa thư viện OpenCV của Intel vì tính phổ biến và những khả năng của
nó có thể phục vụ cho công việc của tôi.
2.1. Tổng quan về thư viện OpenCV
OpenCV là một thư viện thị giác máy tính mã nguồn mở của Intel nó có thể
làm đơn giản hóa công việc lập trình thị giác máy tính của ban. OpenCV bao gồm
nhiều khả năng tiên tiến – tìm, theo dõi, nhận dạng các bề mặt, lọc Kalman , là sự
đa dạng của một hệ thống trí tuệ nhân tạo. Ngoài ra nó còn cung cấp các cơ sở
thuật toán thị giác máy tính thông qua các giao diện lập trình ứng dụng ở mức
thấp. Nó được đóng gói và hoàn toàn miễn phí , người dùng có thể sẵn sàng sử
dụng cho những mục đích khác nhau của họ.
Intel đưa ra phiên bản OpenCV đầu tiên vào năm 1999. Ban đầu , nó chỉ là
thư viện xử lý ảnh của Intel. Về sau , tính lệ thuộc đó đã được loại bỏ và bây giờ
bạn có thể sử dụng OpenCV như một thư viện độc lập. OpenCV là một thư viện đa
nền tảng, nó chấp nhận cả Window và Linux, hơn thế nữa gần đây là Mac OSX.
2.2. Những khả năng của OpenCV
OpenCV có nhiều chức năng , sau đây là tóm tắt các chức năng của nó:
- Ảnh và vào ra video
Các giao diện này cho phép bạn đọc dữ liệu ảnh từ các tệp hoặc từ các video
sống. Bạn cũng có thể tạo file ảnh và video.
- Thị giác máy tính nói chung và các giải thuật xử lý ảnh (APIs mức thấp và
trung bình)
Sử dụng các giao diện này, bạn có thể thí nghiệm với nhiều thuật toán thị
giác nhân tạo chuẩn mà bạn không cần viết code về chúng. Chúng bao gồm sự dò
tìm viền, đường thẳng và góc, điều chỉnh elip, lấy mẫu và những biến đổi khác
nhau (Furiê rời rạc, cosin rời rạc và các biến đổi khoảng cách), v.v…
- Những module thị giác máy ở mức cao
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 4
OpenCV bao gồm vài khả năng ở mức cao. Ngoài việc dò tìm, nhận dạng và
theo dõi khuôn mặt nó còn bao gồm cả luồng quang hoc (sử dụng sự di chuyển
động của camera để xác định cấu trúc 3D), định cỡ camera và hình khối.
- Các giải thuật trí tuệ nhân tạo và dạy học máy
Các ứng dụng thị giác máy tính thường đòi hỏi các phương pháp dạy học
máy hoặc trí tuệ nhân tạo (AI) khác. Một vài trong số chúng sẵn có trong gói dạy
học máy của OpenCV.
- Lấy mẫu ảnh và các biến đổi khung nhìn
Nó thường có ích để xử lý một tập điểm như một khổi. OpenCV bao gồm
giao diện cho những sự phân miền sao chép ảnh, xử lý ngẫu nhiên, hồi phục kích
thước yêu cầu, làm vênh, quay và sử dụng những hiệu ứng phối cảnh.
- Các phương pháp tạo và phân tích ảnh nhị phân
Ảnh nhị phân thường xuyên được sử dụng trong các hệ thống quét để kiểm
tra khuyết điểm hình dạng hay đểm các bộ phận của vật.
- Thao tác với ảnh 3D
Các chức năng này có ích cho phép ánh xạ và sự xác định vị trí – hay với
thiết bị vật thể hoặc với nhiều dạng phép chiế từ một camera đơn.
- Các thuật toán xử lý ảnh, thị giác máy và hiển thị ảnh
OpenCV bao gồm cả toán học cũ, các thuật toán đại số tuyến tính, khoa học
thống kê và hình học tính toán.
- Đồ họa
Các giao diện này cho phép bạn viết chữ và vẽ trên ảnh. Thêm vào các hàm
khác nhau và khả năng sáng tạo, các hàm này có ích cho sự ghi nhãn và đánh dấu.
Ví dụ, nếu bạn viết một chương trình dò tìm đối tượng , nó giúp ích cho các ảnh
nhãn về kích thước và vị trí của chúng.
- Các phương pháp GUI
OpenCV bao gồm các giao diện cửa sổ của chính nó. Trong khi đây là hạn
chế so sánh tới cái gì có thể được làm trên mỗi nền tảng, họ cung cấp API đơn,
nhiều nền tảng để hiển thị ảnh, chấp nhận người sử dụng nhập vào qua chuột hay
bàn phím và thực hiện điều khiển bằng thanh trượt.
- Cấu trúc dữ liệu và thuật toán
Với những giao diện này bạn có thể lưu trữ, tìm kiểm , bảo lưu và thao tác
một cách hiệu nghiệm các danh sách lớn, đống ,đồ thị và cây.
- Ổn định dữ liệu
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 5
Các phương pháp này cung cấp các giao diện tiện lợi cho các kiểu lưu trữ
khác nhau của dữ liệu trên đĩa và khôi phục chúng sau.
2.3. Cấu tạo của OpenCV
Chức năng của OpenCV được chứa trong các module khác nhau :
- CXCORE chứa các định nghĩa kiểu dữ liệu cơ sở. Ví dụ, các cấu trúc dữ
liệu cho ảnh, điểm và hình chữ nhật được định nghĩa trong cxtypes.h .
CXCORE cũng chứa đại số tuyến tính và phương pháp thống kê, chức năng
duy trì và điều khiển chuỗi. Một số ít, các chức năng đồ họa để vẽ trên ảnh
cũng được đặt ở đây.
- CV chứa các thuật toán về xử lý ảnh và định kích cỡ camera. Các chức năng
hình họa máy tính cũng được đặt ở đây.
- CVAUX được mô tả trong tài liệu của OpenCV như chứa các mã cũ và thứ
nghiệm. Tuy nhiên, các giao diện đơn cho sự nhận diện ảnh ở trong module
này. Code sau này chúng được chuyên dụng cho nhận diện mặt và chúng
được ứng dụng rộng rãi cho mục đích đó.
- HIGHGUI và CVCAM được đặt trong cùng thư mục là “otherlibs”.
HIGHGUI chứa các giao diện vào ra cơ bản, nó cũng chứa các khả
năng cửa sổ mở rộng và vào ra video.
CVCAM chứa các giao diện cho video truy cập qua DirectX trên nền
Windows 32 bits.
2.4. Bắt đầu viết ứng dụng sử dụng OpenCV
Để tạo những ứng dụng cho mục đích của chúng ta, tôi sẽ sử dụng ngôn ngữ
lập trình Visual C++ 6.0 để viết code. Nhưng để viết code sử dụng thư viện
OpenCV thì ta cần phải làm một số công việc sau:
2.4.1. Cài một số phần mềm hỗ trợ
Để viết được ứng dụng dùng ngôn ngữ lập trình Visual C++ 6.0 nên nhất
thiết chúng ta phải cài đặt nó.
Tiếp theo chúng ta cần cài đặt thêm DirectX SDK và Platform SDK vì
OpenCV cần có hỗ trợ hai phần mềm này. Mọi sự giúp đỡ về điều này bạn sẽ tìm
thấy ở “[OPENCV_ROOT]\OpenCV\docs\ faq.htm”, trong đó [OPENCV_ROOT]
là thư mục cài đặt OpenCV của bạn.
Cuối cùng là cài đặt thư viện OpenCV. Đến hiện tại thì đã có năm phiên bản
của OpenCV mà bạn có thể sử dụng (từ bản 1.0 đến beta 5.0), tuy nhiên bản mới
nhất sẽ có những bổ sung và chỉnh sửa mới, vì thế chúng ta sẽ cài đặt bản beta 5.0
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 6
để dùng. Download phiên bản này theo đường dẫn
http://sourceforge.net/projects/opencvlibrary và cài đặt bình thường. Chú ý rằng,
trước khi cài đặt OpenCV thì Visaul C++ 6.0 phải được chạy it nhất một lần rồi.
2.4.2. Thiết lập Visual C++ 6.0 cho OpenCV
a) Thiết lập đường dẫn hệ thống cho biến môi trường
Mặc dù chúng ta đã có một số lựa chọn trong khi cài đặt OpenCV nhưng có
vẽ những lựa chọn này không hoạt động đúng trong các phiên bản hiện thời của
OpenCV. Vì thế chúng ta cần phải thiết đặt lại đường dẫn hệ thống cho các biến
môi trường. Để thực hiện công việc này ta làm thư sau:
Kích vào nút “Start” sau đó chọn “Control Panel” rồi kích đúp vảo mục
“System”, hộp thoại “System Properties” xuất hiện, ta chọn Advanced thì được
như hình 2:
Hình 2. “System Properties” Dialog Box
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 7
Chọn “Environment Variables” thì hộp thoại “Environment Variables” sẽ
xuất hiện như hình 3:
Hình 3. “Environment Variables” Dialog Box
Trong mục “System variables” chọn “Path” sau đó kích vào nút “Edit” và sẽ
xuất hiện hộp thoại “Edit System Variable”, đánh đường đẫn tới thư mục “bin” của
OpenCV vào cuối “Variable value” (chú ý phải ngăn cách bằng dấu chấm phẩy)
như hình 4 sau đó nhấn “OK”.
Hình 4. “Edit System Variable” Dialog Box
Chú ý, phải khởi động lại máy để hệ thống cập nhật biến môi trường. Sau
đó, OpenCV sẽ tìm thấy những DLL trong thư mục “bin” mỗi khi chúng ta chạy
một ứng dụng nào đó.
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 8
b) Chỉ rõ những thư mục trong Visual C++ 6.0
Chúng ta sẽ khởi động Visual C++ 6.0. Từ menu chọn Tools\Options… như
hình 5 .
Hình 5. Tools\Options…
Hộp thoại “Options” xuất hiện, chọn Tab “Directories”, hộp thoại xuất hiện
như hình6 .
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 9
Hình 6. Options\Directories=>Includey files
Trong hộp thoại “Options” ta chọn “Include files” trong “Show directories
for:”, trong “Directories” tạo các đường dẫn tới các thư mục “Include” của
DirectXSDK, Microsoft Platform SDK và OpenCV, chú ý đường dẫn tới
DirectXSDK phải được đặt ở trên cùng như hình 6.
Tiếp theo ta làm tương tự với “Library files”, các đường dẫn sẽ là tới
“…lib\x86” của DirecXSDK và “lib” của OpenCV. Cũng cần chú ý là đường dẫn
tới DirectXSDK phải được đặt trên cùng như hình 7.
Hình 7. Option\Directories s=>Library files
Ta cũng thực hiện tương tự với “Executable files” ,đường dẫn tới hai thư
mục “bin” của DirectXSDK và OpenCV, như hình 8.
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 10
Hình 8. Option\Directories s=>Executacle files
c) Tạo dự án sử dụng OpenCV
Ta sẽ tạo một dự án theo tuần tự File\New… \Projects\Win32 Console
Aplication, đặt tên cho dự án trong mục “Project name”, lưu dự án vào nơi cần
thiết trong “Location”, kích “OK” và mặc định các bước tiếp theo.
Hình 9. New Project
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 11
Trước khi tạo một ứng dụng thực tế chúng ta cần sửa đổi sự thiết lập đự án
tới các đường link. Từ menu chọn “Project\Settings…” (hình 10).
Hình 10. Project\Settings…
Trong “Projects Settíng” chọn dự án của chúng ta, trong “Settings For:”
chọn “All Configurations” (hình 11).
Hình 11. All Configurations
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 12
Chọn Tab “Link”, chọn “General” cho “Categry” (hình 12).
Hình 12. Link General
Trong thẻ “Object/library modules” đánh các thư viện (cv.lib, cxcore.lib,
highgui.lib, strmbase.lib) vào (hình 13).
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 13
Hình 13. Object/library modules
Ta đã thực hiện xong việc thay đổi các đường link, sau đây ta sẽ tạo một ứng
dụng đầu tiên. Từ Menu chọn File\New…\FilesC++ Source File, đánh tên vào
“File name” là ImageViewer, chọn “OK” là xong (hình14).
Hình 14. File\New…\FilesC++ Source File
Tiếp theo viết code cho chương trình đầu tiên như sau:
#include <cv.h>
#include <highgui.h>
void main(int argc, char *argv[])
{
IplImage* image=0; // Dinh nghia mot con tro kieu IplImage
char*filename = argc == 2 ? argv[1] : (char*)"lena.jpg";
image = cvLoadImage(filename, 0); /*Tai mot anh co ten la filename voi cac chi
so : 0 cho anh grayscale , 1 cho anh mau color*/
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 14
if(image != 0)
{
cvNamedWindow("Display", CV_WINDOW_AUTOSIZE); // Tao mot
cua so
cvShowImage("Display", image); // Hien thi anh len cua so
cvWaitKey(0); // Cho cho toi khi mot ky tu duoc an
cvDestroyWindow("Display");//Huy cua so
}
}
Sau khi viết xong code thì thực hiện biên d ịch chương trình (Ctrl+F7 hoặc
F7). Để chạy chương trình chúng ta làm như sau:
Trên thanh Toolbar của Windows kích vào “Start”, chọn “Run”, đánh “cmd”
vào “Open” rồi chọn “OK”, hộp thoại “C:\WINDOWS\system32\cmd.exe” hiện ra
như hình 15.
Hình 15. C:\WINDOWS\system32\cmd.exe
Dùng các thao tác “cd” để chuyển tới các thư mục kế tiếp chứa dự án của
chúng ta và “cd..” để quay về thư mục trước đó. Bằng cách này chúng ta sẽ chỉ tới
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 15
đường dẫn chứa file chạy của dự án của ta như sau: D:\NGHIEN
CUU\OpenCV\Hoc OpenCV\ImageViewer\Debug\ ImageViewer.exe như hình 16
Hình 16. ImageViewer.exe
Trên đây là từng bước để tạo một ứng dụng bằng Visual C++ 6.0 sử dụng
thư viện thị giác máy tính mã nguồn mở - OpenCV. Từ đây, để tạo một dự án mới
ta sẽ làm tuần tự theo các bước trong mục c).
2.5. Các chương trình sử dụng thư viện OpenCV
2.5.1. Các chương trình xử lý ảnh
a) Những thao tác hình thái học
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include <cv.h>
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 16
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
#endif
IplImage* src = 0;
IplImage* image = 0;
IplImage* dest = 0;
IplConvKernel* element = 0;//Cau truc phan tu
const int element_shape = CV_SHAPE_CROSS;//Kieu phan tu hinh thanh
//Dia chi cau bien ma nhan duoc vi tri cua bien cap nhat
int global_pos = 0;
//Goi ham thuc hien thanh truot , thuc hien mo
void Opening(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0
);//Tao cau truc phan tu
cvErode(src,image,element,1);//An mon anh bang viec su dung cau truc phan tu bat ky
cvDilate(image,dest,element,1);//Mo rong anh bang viec su dung cau truc phan tu bat ky
cvReleaseStructuringElement(&element);//Giai phong cau truc phan tu
cvShowImage("Opening and Closing window",dest);
}
//Goi ham thuc hien thanh truot , thuc hien dong
void Closing(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );
cvDilate(src,image,element,1);
cvErode(image,dest,element,1);
cvReleaseStructuringElement(&element);
cvShowImage("Opening and Closing window",dest);
}
//Goi ham thuc hien thanh truot , thuc hien su lam mon
void Erosion(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 17
cvErode(src,dest,element,1);
cvReleaseStructuringElement(&element);
cvShowImage("Erosion and Dilation window",dest);
}
//Goi ham thuc hien thanh truot , thuc hien su gian no
void Dilation(int pos)
{
element = cvCreateStructuringElementEx( pos*2+1, pos*2+1, pos, pos, element_shape, 0 );
cvDilate(src,dest,element,1);
cvReleaseStructuringElement(&element);
cvShowImage("Erosion and Dilation window",dest);
}
int main( int argc, char** argv )
{
char* filename = argc == 2 ? argv[1] : (char*)"baboon.jpg";
if( (src = cvLoadImage(filename,1)) == 0 )
return -1;
image = cvCloneImage(src);
dest = cvCloneImage(src);
//Tao cac cua so cho cac anh dau ra
cvNamedWindow("Opening and Closing window",1);
cvNamedWindow("Erosion and Dilation window",1);
cvShowImage("Opening and Closing window",src);
cvShowImage("Erosion and Dilation window",src);
cvCreateTrackbar("Open","Opening and Closing window",&global_pos,20,Opening);
cvCreateTrackbar("Close","Opening and Closing window",&global_pos,20,Closing);
cvCreateTrackbar("Dilate","Erosion and Dilation window",&global_pos,20,Dilation);
cvCreateTrackbar("Erode","Erosion and Dilation window",&global_pos,20,Erosion);
cvWaitKey(0);
//Giai phong cac con tro anh
cvReleaseImage(&src);
cvReleaseImage(&image);
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 18
cvReleaseImage(&dest);
//Huy cac cua so
cvDestroyWindow("Opening va Closing window");
cvDestroyWindow("Erosion va Dilation window");
return 0;
}
#ifdef _EiC
main(1,"morphology.c");
#endif
Kết quả chạy chương trình:
Hình 17. Những thao tác hình thái học
b) Biến đổi Log – Polar
#include <cv.h>
#include <highgui.h>
int main(int argc, char** argv)
{
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 19
IplImage* src=0;
char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg";
if(( src=cvLoadImage(filename,1))!= 0 )
{
//Khoi tao 3 anh dst,src1 va rsc2
IplImage* dst = cvCreateImage( cvSize(256,256),8/*IPL_DEPTH_8U*/, 3 );
IplImage* src1 = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* src2 = cvCreateImage( cvSize(256,256), 8, 3 );
//Thuc hien ham cvLogPolar voi anh src la anh nguon con anh dst la anh
dich
cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 50,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
//Thuc hien ham cvLogPolar voi anh dst la anh nguon con anh src1 la anh
dich
cvLogPolar( dst, src1, cvPoint2D32f(src->width/2,src->height/2), 50,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP );
//Thuc hien ham cvLogPolar voi anh src1 la anh nguon con anh src2 la anh
dich
cvLogPolar( src1,src2, cvPoint2D32f(src->width/2,src->height/2), 50,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS/*+CV_WARP_INVERSE_MAP*/ );
cvNamedWindow( "log-polar", 1 );
cvShowImage( "log-polar", dst );
cvNamedWindow( "inverse log-polar", 1 );
cvShowImage( "inverse log-polar", src1 );
cvNamedWindow( "inverse-inverse log-polar", 1 );
cvShowImage( "inverse-inverse log-polar", src2 );
cvWaitKey();
}
return 0;
}
Kết quả chương trình như sau:
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 20
Hình 18. Log – Polar
c) Những sự biến đổi ảnh đặc biệt (Biến đổi Hough)
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
IplImage* src=0;
char*filename = argc == 2 ? argv[1] : (char*)"pic1.png";
if((src=cvLoadImage(filename,0))!= 0)
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 21
{
IplImage* dst = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* color_dst = cvCreateImage( cvGetSize(src), 8, 3 );
CvMemStorage* storage = cvCreateMemStorage(0);//Tao kho bo nho
CvSeq* lines = 0;
int i;
cvCanny( src, dst, 0, 200, 5 );//Thuc hien giai thuat Canny cho su nhan dang goc
cvCvtColor( dst, color_dst, CV_GRAY2BGR );//Chuyen sang anh den trang(Grayscale)
#if 1
lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0
);//Tim cac duong trong anh nhi phan su dung bien doi Hough
for( i = 0; i < MIN(lines->total,100); i++ )
{
float* line = (float*)cvGetSeqElem(lines,i);//Tra lai con tro cho phan tu chuoi boi chi so
cua no
float rho = line[0];
float theta = line[1];
CvPoint pt1, pt2;//Khai bao hai diem
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 400*(-b));//Ep thanh kieu so nguyen
pt1.y = cvRound(y0 + 400*(a));
pt2.x = cvRound(x0 - 400*(-b));
pt2.y = cvRound(y0 - 400*(a));
cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8 );//Thuc hien ve duong thang
}
#else
lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 80,
30, 10 );
for( i = 0; i < lines->total; i++ )
{
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
}
#endif
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 22
cvNamedWindow( "Destination", 1 );
cvShowImage( "Destination", dst );
cvNamedWindow( "Hough", 1 );
cvShowImage( "Hough", color_dst );
cvWaitKey();
}
return 0;
}
Kết quả chương trình như sau:
Hình 19. Biến đổi Hough
2.5.2. Các chương trình tìm mặt người trong ảnh
Dò tìm mặt sử dụng sự phân loại HAARCASCADE #include <stdio.h>
#include "cxcore.h"
#include "cv.h"
#include "highgui.h"
//8 bit, color or gray - deprecated, use CV_LOAD_IMAGE_ANYCOLOR
#define CV_LOAD_IMAGE_UNCHANGED -1
// 8 bit, gray
#define CV_LOAD_IMAGE_GRAYSCALE 0
//8 bit unless combined with CV_LOAD_IMAGE_ANYDEPTH, color
#define CV_LOAD_IMAGE_COLOR 1
//any depth, if specified on its own gray
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 23
#define CV_LOAD_IMAGE_ANYDEPTH 2
//by itself equivalent to CV_LOAD_IMAGE_UNCHANGED
//but can be modified with CV_LOAD_IMAGE_ANYDEPTH
#define CV_LOAD_IMAGE_ANYCOLOR 4
void main(int argc,char**argv)
{
CvHaarClassifierCascade*pCascade=0;//Do tim mat
CvMemStorage*pStorage=0;//Bo dem bo nho mo rong
CvSeq*pFaceRectSeq;//Danh sach cac mat phat hien
int i;
//Khoi tao
IplImage*pInpImg=(argc>1)?cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR):0;
pStorage=cvCreateMemStorage(0);
pCascade=(CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml",0,
0,0);
//Lam cho co hieu luc moi thu khoi tao dung muc
if(!pInpImg||!pStorage||!pCascade)
{
printf("Khoi tao loi:%s\n",
(!pInpImg)?"khong tai duoc file anh":
(!pCascade)?"khong tai duoc HaarCascade--""hay chac chan la duong dan dung":
"loi cap phat bo nho cho kho du lieu");
exit(-1);
}
//Phat hien mat trong anh
pFaceRectSeq=cvHaarDetectObjects(pInpImg,pCascade,pStorage,
1.1,//quy mo tim kiem tang 10% tung anh di qua
3,//cac nhom giam sut it hon 3 su tim kiem
CV_HAAR_DO_CANNY_PRUNING,//bo qua nhung vung khong chac de chua
dung mot mat
cvSize(0,0));//su dung xml mac dinh cho quy mo tim kiem nho
//tao mot cua so de chua dung nhung mat tim kiem duoc
cvNamedWindow("Haar Window",0);
//Ve mot bien dang hinh chu nhat quanh moi khuon mat tim duoc
for(i=0;i<(pFaceRectSeq?pFaceRectSeq->total:0);i++)
{
CvRect*r=(CvRect*)cvGetSeqElem(pFaceRectSeq,i);
CvPoint pt1={r->x,r->y};
CvPoint pt2={r->x+r->width,r->y+r->height};
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 24
cvRectangle(pInpImg,pt1,pt2,CV_RGB(0,255,0),3,4,0);
}
//Hien thi nhung mat tim duoc
cvShowImage("Haar Window",pInpImg);
cvWaitKey(0);
cvDestroyWindow("Haar Window");
//Giai phong tai nguyen
cvReleaseImage(&pInpImg);
if(pCascade)
cvReleaseHaarClassifierCascade(&pCascade);
if(pStorage)
cvReleaseMemStorage(&pStorage);
}
Kết quả chương trình như sau:
Hình 20. Tìm khuôn mặt trong ảnh
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 25
2.5.3. Các chương trình theo dõi
CamShiftDemo
#ifdef _CH_
#pragma package <opencv>
#endif
#ifndef _EiC
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <ctype.h>
#endif
IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;
CvHistogram *hist = 0;//Bieu do
int backproject_mode = 0;
int select_object = 0;
int track_object = 0;
int show_hist = 1;
CvPoint origin;
CvRect selection;
CvRect track_window;
CvBox2D track_box;
CvConnectedComp track_comp;
int hdims = 16;
float hranges_arr[] = {0,180};
float* hranges = hranges_arr;
int vmin = 10, vmax = 256, smin = 30;
void on_mouse( int event, int x, int y, int flags, void* param )
{
if( !image )
return;
if( image->origin )
y = image->height - y;
if( select_object )
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 26
{
selection.x = MIN(x,origin.x);
selection.y = MIN(y,origin.y);
selection.width = selection.x + CV_IABS(x - origin.x);
selection.height = selection.y + CV_IABS(y - origin.y);
selection.x = MAX( selection.x, 0 );
selection.y = MAX( selection.y, 0 );
selection.width = MIN( selection.width, image->width );
selection.height = MIN( selection.height, image->height );
selection.width -= selection.x;
selection.height -= selection.y;
}
switch( event )
{
case CV_EVENT_LBUTTONDOWN:
origin = cvPoint(x,y);
selection = cvRect(x,y,0,0);
select_object = 1;
break;
case CV_EVENT_LBUTTONUP:
select_object = 0;
if( selection.width > 0 && selection.height > 0 )
track_object = -1;
break;
}
}
CvScalar hsv2rgb( float hue )
{
int rgb[3], p, sector;
static const int sector_data[][3]=
{{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}};
hue *= 0.033333333333333333333333333333333f;
sector = cvFloor(hue);//Chuyen doi kieu floating-point sang integer
p = cvRound(255*(hue - sector));//Chuyen doi kieu double sang integer
p ^= sector & 1 ? 255 : 0;
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 27
rgb[sector_data[sector][0]] = 255;
rgb[sector_data[sector][1]] = 0;
rgb[sector_data[sector][2]] = p;
return cvScalar(rgb[2], rgb[1], rgb[0],0);
}
int main( int argc, char** argv )
{
CvCapture* capture = 0;
if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );//Bat video tu webcam
else if( argc == 2 )
capture = cvCaptureFromAVI( argv[1] ); //Bat video tu file avi
if( !capture )
{
fprintf(stderr,"Could not initialize capturing... \n");
return -1;
}
printf( "Hot keys: \n"
"\tESC - quit the program\n"
"\tc - stop the tracking\n"
"\tb - switch to/from backprojection view\n"
"\th - show/hide object histogram\n"
"To initialize tracking, select the object with mouse\n" );
cvNamedWindow( "Histogram", 1 );
cvNamedWindow( "CamShiftDemo", 1 );
cvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );
cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );//Tao thanh Trackbar
cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 );
cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 );
for(;;)
{
IplImage* frame = 0;
int i, bin_w, c;
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 28
frame = cvQueryFrame( capture );//Tao dong video bat duoc tu webcam
if( !frame )
break;
if( !image )
{
/* Cap phat tat ca cac bo dem */
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
hue = cvCreateImage( cvGetSize(frame), 8, 1 );
mask = cvCreateImage( cvGetSize(frame), 8, 1 );
backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );//Tao bieu do
histimg = cvCreateImage( cvSize(320,200), 8, 3 );//Anh chua bieu do
cvZero( histimg );//Xoa anh bieu do
}
cvCopy( frame, image, 0 );//Copy khung nhin vao anh
cvCvtColor( image, hsv, CV_BGR2HSV );//Chuyen anh thu duoc sang dang HSV
if( track_object )
{
int _vmin = vmin, _vmax = vmax;
cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0),
cvScalar(180,256,MAX(_vmin,_vmax),0), mask );//Kiem tra su sai khac giua 2
Scalar
cvSplit( hsv, hue, 0, 0, 0 );//Chia mang nhieu kenh vao trong cac mang don kenh hay rut
mot kenh don tu mang do
if( track_object < 0 )
{
float max_val = 0.f;
cvSetImageROI( hue, selection );//Dat kenh quan tam toi gia tri duoc chon
cvSetImageROI( mask, selection );
cvCalcHist( &hue, hist, 0, mask );
cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 29
cvResetImageROI( hue );
cvResetImageROI( mask );
track_window = selection;
track_object = 1;
cvZero( histimg );
bin_w = histimg->width / hdims;
for( i = 0; i < hdims; i++ )
{
int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 );
CvScalar color = hsv2rgb(i*180.f/hdims);
cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
cvPoint((i+1)*bin_w,histimg->height - val),
color, -1, 8, 0 );
}
}
cvCalcBackProject( &hue, backproject, hist );
cvAnd( backproject, mask, backproject, 0 );
cvCamShift( backproject, track_window,
cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),
&track_comp, &track_box );
track_window = track_comp.rect;
if( backproject_mode )
cvCvtColor( backproject, image, CV_GRAY2BGR );
if( image->origin )
track_box.angle = -track_box.angle;
cvEllipseBox( image, track_box, CV_RGB(255,0,0), 3, CV_AA, 0 );
}
if( select_object && selection.width > 0 && selection.height > 0 )
{
cvSetImageROI( image, selection );
cvXorS( image, cvScalarAll(255), image, 0 );
cvResetImageROI( image );
}
cvShowImage( "CamShiftDemo", image );
cvShowImage( "Histogram", histimg );
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 30
c = cvWaitKey(10);
if( c == 27 )
break;
switch( c )
{
case 'b':
backproject_mode ^= 1;
break;
case 'c':
track_object = 0;
cvZero( histimg );
break;
case 'h':
show_hist ^= 1;
if( !show_hist )
cvDestroyWindow( "Histogram" );
else
cvNamedWindow( "Histogram", 1 );
break;
default:
;
}
}
cvReleaseCapture( &capture );
cvDestroyWindow("CamShiftDemo");
return 0;
}
#ifdef _EiC
main(1,"camshiftdemo.c");
#endif
Kết quả chương trình như sau:
Thị giác máy – Computer Vision [email protected]
Trần Quóc Dăng - Cơ Điện Tử 2 – K48 - ĐHBKHN Trang 31
Hình 21. Một số hình ảnh thu được khi điều chỉnh các thanh trượt
Hình 22. Biểu đồ thu được ứng với trường hợp trên