Trên thị trường đã có rất nhiều ứng dụng từ điển được phát triển cho điện thoại di động như Lạc Việt, Stardict, MobiDict,… Khi sử dụng những ứng dụng từ điển này, người dùng sẽ nhập từ c
Trang 1NGUYỄN HOÀNG GIANG
XÂY DỰNG ỨNG DỤNG TRA TỪ ĐIỂN BẰNG CAMERA TRÊN ĐIỆN THOẠI DI ĐỘNG
LUẬN VĂN THẠC SĨ NGÀNH HỆ THỐNG THÔNG TIN
Thành phố Hồ Chí Minh - 2011
Trang 2NGUYỄN HOÀNG GIANG
XÂY DỰNG ỨNG DỤNG TRA TỪ ĐIỂN BẰNG CAMERA TRÊN ĐIỆN THOẠI DI ĐỘNG
Trang 3LỜI CÁM ƠN
Lời đầu tiên, tôi xin chân thành cám ơn thầy Đinh Điền và thầy Trần Thái Sơn, những người đã cung cấp ý tưởng, hướng dẫn, động viên và hỗ trợ tôi rất nhiều trong quá trình thực hiện luận văn
Tôi cũng xin chân thành cảm ơn các thầy cô trong Khoa Công nghệ thông tin, Trường Đại học Khoa học Tự nhiên đã truyền thụ cho tôi những kiến thức quý báu trong suốt thời gian học tập tại trường, tạo nền tảng kiến thức giúp tôi thực hiện tốt luận văn này
Cuối cùng, tôi xin chân thành cám ơn gia đình, các bạn ở lớp cao học K18 và các bạn tại Công ty Dữ liệu Đa ngữ Kim từ điển đã giúp đỡ, động viên tôi trong suốt thời gian của khóa học cũng như trong lúc thực hiện luận văn
Tp Hồ Chí Minh, tháng 09 năm 2011
Học viên thực hiện Nguyễn Hoàng Giang
Trang 4MỤC LỤC
Trang 53.3.2 Chuyển mã bộ nhận dạng Tesseract vào hệ điều hành Symbian 47
4.1.1.1 Tổ chức các mục từ có kích thước bằng nhau 54 4.1.1.2 Tổ chức các mục từ có kích thước biến động 54 4.1.2 Tổ chức cấu trúc dữ liệu hỗ trợ cho việc tìm kiếm nhanh 55
5.2 Kết quả thử nghiệm khối nhận dạng ký tự quang học 68
Trang 7DANH MỤC BẢNG
Bảng 3.1: Độ chính xác của Tesseract đối với một số ngôn ngữ 41
Bảng 3.2: So sánh giữa các bộ nhận dạng thương mại và Tesseract 42
Bảng 4.2: Các trường dữ liệu trong mẫu tập tin chỉ mục 56
Bảng 4.3: Một phần của ma trận chữ cái tương tự theo David B Boles 63
Bảng 4.4: Một phần ma trận chữ cái tương tự theo McGraw 63
Bảng 4.5: Danh sách các chữ cái và các chữ cái gần giống 64
Bảng 5.1: Kết quả chạy thử nghiệm trên máy Nokia N97 67
Bảng 5.2: Kết quả kiểm tra ứng dụng đối với tiếng Anh 69
Bảng 5.3: Một số trường hợp nhận dạng sai (tiếng Anh) 70
Bảng 5.4: Kết quả kiểm tra ứng dụng đối với tiếng Việt 71
Bảng 5.5: Một số trường hợp nhận dạng sai (tiếng Việt) 72
Trang 8DANH MỤC HÌNH VẼ
Hình 1.1: Mô hình “Ứng dụng tra từ điển bằng camera trên điện thoại di động” 4
Hình 5.2: Một ví dụ về kết quả nhận dạng đúng (tiếng Anh) 69
Trang 9Hình A.6: Menu Options 80
Trang 101 Chương 1 : TỔNG QUAN VỀ ĐỀ TÀI
TỔNG QUAN VỀ ĐỀ TÀI
1.1 Nhu cầu thực tế và lý do thực hiện đề tài
Trong cuộc sống của con người, thông tin liên lạc là một nhu cầu không thể thiếu đối với con người Vô số phương pháp liên lạc đã ra đời nhằm phục vụ nhu cầu này như thư tín, điện thoại bàn, thư điện tử, điện thoại di động, Trong đó, điện thoại di động nổi bật lên như một phương tiện liên lạc hữu ích nhất, tiện lợi nhất, đặc biệt đối với những người sống và làm việc ở các đô thị lớn Điện thoại di động, với chức năng đàm thoại trực tiếp mọi lúc mọi nơi, ngày càng được sử dụng rộng rãi như một “vật bất ly thân” của con người
Hiện nay trên thế giới, điện thoại di động đã và đang phát triển không ngừng Hàng loạt điện thoại với các tính năng, ứng dụng hiện đại được tung ra thị trường
Có thể nói điện thoại di động là thiết bị điện tử phát triển nhanh chóng nhất cả về công nghệ lẫn tính năng, ứng dụng Riêng ở Việt Nam, thị trường điện thoại di động
đã và đang phát triển mạnh mẽ với số lượng người dùng đông đảo, hơn hẳn các thiết
bị di động cá nhân khác như Pocket PC, máy nghe nhạc,…
Bên cạnh đó, nhu cầu về một bộ từ điển đa ngôn ngữ phục vụ cho công việc, học tập, giao tiếp,… là luôn luôn cần thiết Tuy nhiên không phải lúc nào chúng ta cũng có mặt ở nhà, ở cơ quan để tra từ điển Việc mang theo một quyển từ điển dày cộm hoặc máy tính xách tay khi đi công tác, đi học, đi du lịch,… đem đến cho người dùng rất nhiều bất tiện Vì vậy, một ứng dụng từ điển trên điện thoại di động cho phép tra cứu “mọi lúc mọi nơi” luôn được người dùng chờ đợi và ủng hộ Sự ra đời của thế hệ điện thoại thông minh sử dụng hệ điều hành mở Symbian đã cho phép thực hiện điều này
Trang 11Trên thị trường đã có rất nhiều ứng dụng từ điển được phát triển cho điện thoại
di động như Lạc Việt, Stardict, MobiDict,… Khi sử dụng những ứng dụng từ điển này, người dùng sẽ nhập từ cần tra cứu bằng bàn phím của điện thoại di động Việc này hoàn toàn dễ dàng đối với các ngôn ngữ Latin như tiếng Anh, nhưng điều tương
tự không diễn ra đối với các ngôn ngữ có dấu như tiếng Việt, các ngôn ngữ tượng hình như tiếng Hoa, tiếng Nhật,… Việc nhập từ cần tra cứu chỉ thật sự dễ dàng đối với những người dùng có một kiến thức nhất định về ngôn ngữ cần tra cứu, tối thiểu
là kiến thức về bộ gõ, và trong trường hợp mẫu điện thoại đang sử dụng có hỗ trợ
bộ gõ Vấn đề đặt ra là một người dùng không biết tiếng Việt nhưng lại muốn tra cứu nghĩa của một từ trong tiếng Việt thì phải làm như thế nào? Như vậy là phải cần
có một cách thức nhập từ khác so với cách truyền thống
Mọi việc sẽ dễ dàng hơn nếu ứng dụng từ điển cho phép người dùng sử dụng camera của điện thoại di động để chụp hình từ cần tra cứu để làm đầu vào thay vì phải nhập từ bàn phím, khi đó việc am hiểu về ngôn ngữ đang tra cứu và bộ gõ của ngôn ngữ đó không còn thật sự cần thiết nữa
Ngoài ra, chất lượng hình ảnh được chụp bằng camera của điện thoại di động ngày càng được cải thiện và hầu hết các điện thoại di động đều có camera với độ phân giải cao
Vì những lý do trên, “Ứng dụng tra từ điển bằng camera trên điện thoại di động” là một ứng dụng thật sự có ý nghĩa thực tiễn rất to lớn
1.2 Mục tiêu của đề tài
Mặc dù đã có những ứng dụng từ điển trên điện thoại di động nhưng các ứng dụng này chưa thật sự mang lại cho người dùng hiệu quả và sự tiện lợi khi sử dụng Những ứng dụng từ điển này chỉ cho phép người dùng nhập từ cần tra cứu bằng bàn phím của điện thoại di động, đây là một hạn chế của các ứng dụng này Nếu người dùng có kiến thức về ngôn ngữ cần tra cứu và thành thạo trong việc nhập từ cần tra cứu bằng bàn phím điện thoại thì họ hoàn toàn có thể dùng các ứng dụng này một cách dễ dàng Còn trong trường hợp hoặc người dùng chưa có (hoặc có ít) kiến thức
Trang 12về ngôn ngữ cần tra cứu hoặc họ chưa thành thạo trong việc sử dụng bộ gõ thì họ sẽ gặp rất nhiều khó khăn khi sử dụng các ứng dụng này thậm chí là hoàn toàn không thể sử dụng được
Một phương pháp để khắc phục hạn chế trên là sử dụng camera của điện thoại
di động để chụp ảnh của từ cần tra cứu rồi dùng bộ nhận dạng ký tự quang học (Optical Character Recognition - OCR) để rút trích ký tự dưới dạng văn bản, sau đó dùng kết quả nhận dạng làm đầu vào cho các bộ từ điển thông thường
Chính vì vậy, mục tiêu của đề tài là xây dựng một ứng dụng từ điển thông
minh trên điện thoại di động có khả năng tra cứu từ trên giấy thông qua camera được tích hợp sẵn trên điện thoại di động, từ đó có thể giúp cho người dùng tra cứu
từ vựng trên sách, báo một cách đơn giản và tiện dụng
Để thực hiện được mục tiêu đã nêu trên chúng ta phải khai thác khả năng nhận dạng ký tự quang học của camera trên điện thoại di động, sau đó là tìm ra ngữ nghĩa của từ vừa được nhận dạng Những việc này đòi hỏi một công nghệ tiền xử lý ảnh, nhận dạng mạnh, một kho dữ liệu lớn,… Nhưng tất cả lại được xây dựng trên một môi trường có tài nguyên yếu như điện thoại di động, có thể nói là đề tài này phải đối mặt với nhiều thách thức không nhỏ
Tuy nhiên một ứng dụng như thế này rất hữu ích và tiện dụng nên cũng đã có không ít các dự án có cùng tham vọng từ việc khai thác khả năng của camera trên điện thoại di động Hình 1.1 mô tả mô hình của “Ứng dụng tra cứu từ điển bằng camera trên điện thoại di động”:
Đầu vào của ứng dụng: là văn bản giấy chứa từ cần tra
Đầu ra của ứng dụng: là kết quả tra từ điển (hoặc là nghĩa của từ cần tra hoặc
là các thông báo lỗi)
Ứng dụng gồm ba khối xử lý: khối thu nhận và tiền xử lý ảnh, khối nhận dạng
ký tự quang học, khối xử lý ngôn ngữ và tra từ điển Ba khối này sẽ lần lượt được giới thiệu trong các chương 2, 3 và 4
Trang 13Hình 1.1: Mô hình “Ứng dụng tra từ điển bằng camera trên điện thoại di động”
1.3 Nội dung thực hiện
Luận văn này tập trung nghiên cứu các vấn đề sau:
Ø Hệ điều hành Symbian và môi trường lập trình Carbide C++
Ø Tiền xử lý ảnh trên điện thoại di động để cải thiện kết quả nhận dạng
Ø Nhận dạng ký tự quang học trên điện thoại di động đối với hai ngôn ngữ tiếng Anh và tiếng Việt
Ø Xử lý ngôn ngữ tự nhiên để cải thiện kết quả nhận dạng
Ø Xây dựng bộ từ điển song ngữ Anh – Việt trên điện thoại di động
Kết quả nhận dạng của bộ nhận dạng ký tự quang học phụ thuộc rất nhiều vào môi trường chụp ảnh và chất lượng ảnh chụp, vì vậy việc nghiên cứu này được giới hạn trong phạm vi ảnh được chụp từ văn bản giấy trong điều kiện ánh sáng tốt Trong phạm vi của luận văn này, văn bản giấy có những đặc điểm sau:
• Màu giấy: đồng nhất, tốt nhất là màu trắng
• Màu chữ: đồng nhất, tốt nhất là màu đen
• Font chữ: các font chữ thông dụng như Times New Roman, Arial, Tahoma, VNI-Times
Nghĩa của từ cần tra
Thu nhận và tiền xử lý ảnh
Trang 14• Kiểu chữ: chữ thường hoặc chữ nghiêng
• Cỡ chữ: 12 pt
Cuối cùng, luận văn này sẽ đánh giá lợi ích và những hạn chế của “Ứng dụng tra từ điển bằng camera trên điện thoại di động” để từ đó có thể nêu ra được những hướng phát triển trong tương lai của đề tài
1.4 Đóng góp của luận văn
Luận văn này đã đưa ra một mô hình cơ bản của một ứng dụng tra từ điển bằng camera trên điện thoại di động, góp phần mang lại một phương thức tra từ điển mới vừa mang phong cách hiện đại vừa thuận tiện cho người dùng
Luận văn đã xây dựng thành công “Ứng dụng tra từ điển bằng camera trên điện thoại di động” và đã đạt được một số kết quả khả quan
Ngoài ra, luận văn đã cải tiến một số tính năng của bộ nhận dạng ký tự quang học Tesseract (sẽ được trình bày trong chương 3), góp phần nâng cao độ chính xác
và tốc độ của bộ nhận dạng này trong phạm vi ứng dụng tra từ điển
1.5 Cấu trúc của luận văn
Luận văn gồm có 6 chương:
Chương 1 Tổng quan về đề tài
Chương 2 Thu nhận và tiền xử lý ảnh
Chương 3 Nhận dạng ký tự quang học
Chương 4 Xử lý ngôn ngữ và tra từ điển
Chương 5 Kết quả thực nghiệm
Chương 6 Kết luận và hướng phát triển
Trang 152 Chương 2 : THU NHẬN VÀ TIỀN XỬ LÝ ẢNH
THU NHẬN VÀ TIỀN XỬ LÝ ẢNH
Trong thời gian gần đây, chất lượng của camera điện thoại di động ngày càng được cải thiện Một số điện thoại di động có khả năng thay thế cả máy chụp ảnh kỹ thuật số thông thường Hệ điều hành Symbian1 có cung cấp đầy đủ các API (Application Programming Interface) để xây dựng khối chụp ảnh trên điện thoại di động Vì vậy, việc thu nhận ảnh của từ cần tra cứu trên giấy là một việc làm không mấy khó khăn
Ngoài ra, để nâng cao chất lượng của ảnh chụp đồng thời cải thiện độ chính xác của khối nhận dạng ký tự quang học, việc xây dựng khối tiền xử lý ảnh là hết sức cần thiết Hình 2.1 mô tả lưu đồ của khối thu nhận và tiền xử lý ảnh
Hình 2.1: Khối thu nhận và tiền xử lý ảnh
Ảnh đã được thu nhận và
xử lý
Trang 162.1 Thu nhận ảnh
Ứng dụng sẽ kết nối với camera của điện thoại di động để chụp ảnh của từ cần tra cứu trên giấy Ảnh thu được có thể gồm nhiều từ không cần tra cứu Phần này sẽ giới thiệu về các API mà hệ điều hành Symbian cung cấp cho người lập trình và cách truy xuất vào camera của điện thoại di động để chụp ảnh
2.1.1 Giới thiệu về bộ khung đa phương tiện
Hệ điều hành Symbian cung cấp một bộ khung đa phương tiện (Multimedia Framework - MMF) [3] để hỗ trợ các chức năng sau:
• Thu, phát và chuyển đổi âm thanh
Các nhà sản xuất điện thoại di động chỉ cung cấp thêm các plug-in điều khiển cho một số thiết bị cụ thể vì điều đó phụ thuộc vào các thành phần phần cứng cấu thành điện thoại, giấy phép phát hành, các yêu cầu DRM (Digital Rights Management) hay các yếu tố kinh doanh khác
Trang 17Hình 2.2: Kiến trúc của MMF 2.1.2 Camera
Khi camera trở nên phổ biến trên điện thoại di động, các nhà sản xuất điện thoại di động đã cho phép người phát triển truy xuất các chức năng của camera bằng nhiều API khác nhau Từ đó đã xảy ra sự phân mảnh, điều này có nghĩa là đã có nhiều mã nguồn điều khiển camera được viết phụ thuộc vào nền tảng của điện thoại
và khả năng riêng biệt của thiết bị
Để giải quyết vấn đề này, Symbian đã định nghĩa một API camera chung, đó
là API Ecam, được phát hành lần đầu tiên trên hệ điều hành Symbian 7.0 Trong mỗi phiên bản hệ điều hành được phát hành sau này lại có thêm các chức năng để
có thể phủ hết các phần cứng camera đã có và cung cấp một API chung để người phát triển có thể làm việc với bất cứ phần cứng nào trên bất cứ điện thoại thông
Trình điều khiển bộ khung đa phương tiện
Trình điều khiển
audio
Trình điều khiển video
Codec DevSound
Giao diện audio Giao diện video Giao diện bộ phát âm Giao diện audio streaming
Thu, phát & chuyển đổi Thu & phát
Âm và DTMF
Đường biên Audio vào & ra
Trang 18minh Symbian nào API Ecam cung cấp chức năng hiển thị kính ngắm (viewfinder)
và chụp ảnh tĩnh từ camera
2.1.2.1 Truy xuất camera
API ECam là API mở, có khả năng mở rộng và là một API chung chuyên cung cấp các chức năng để điều khiển camera kỹ thuật số trên điện thoại di động, gửi yêu cầu và nhận dữ liệu hình ảnh cụ thể từ nó Hình 2.3 chỉ ra vị trí của API ECam trong
hệ thống con đa phương tiện (multimedia subsystem) và những thành phần đa phương tiện khác tương tác với nó [3]
Hình 2.3: Hệ thống con đa phương tiện
Thành phần camera onboard cung cấp các hình ảnh cho các khách hàng của
nó Khách hàng có thể là một ứng dụng yêu cầu hình ảnh, ví dụ như ứng dụng chụp ảnh Các khách hàng có thứ tự ưu tiên khác nhau và có thể giành quyền ưu tiên trước các khách hàng khác trong khi tương tác với camera Khi một khách hàng cần chia sẻ camera với một thành phần khác, nó tạo ra một kênh điều khiển và truyền kênh điều khiển này cho thành phần đó
Ứng dụng khách
“Ảnh tĩnh”
(vd: ứng dụng camera)
Thư viện chuyển
đổi hình ảnh API dành cho
Camera onboard
Bộ khung Đa phương tiện
Trang 19Sự bảo mật platform yêu cầu các ứng dụng phải có khả năng (capability) UserEnvironment để tạo ra đối tượng CCamera Ứng dụng khách phải khai báo tập tin header ecam.h và liên kết với thư viện ecam.lib
Để truy xuất camera, người phát triển phải sử dụng phương thức CCamera::NewL() để tạo ra đối tượng Tùy thuộc vào việc tạo ra đối tượng CCamera, phương thức NewL() có thể trả về một số lỗi sau:
• KErrPermissionDenied(-46): nếu ứng dụng không có khả năng UserEnvironment
• KErrNotSupported(-5) nếu:
o Chức năng camera không được hỗ trợ Một vài trình giả lập (emulator) không hỗ trợ chức năng camera và người phát triển phải chạy thử trên thiết bị thật
o Trình quan sát MCameraObserver2 được cung cấp nhưng chỉ có trình quan sát McameraObserver cũ hơn được hỗ trợ
Sau khi đối tượng camera được tạo ra, camera sẽ được dành riêng bằng cách gọi phương thức CCamera::Reserve()
Ứng dụng khách phải hiện thực giao diện gọi lại (callback interface) để camera có thể thông báo khi các sự kiện xảy ra, ví dụ như là khi hình ảnh đang được chụp hay bộ đệm dữ liệu video đã sẵn sàng Giao diện gọi lại được khuyên dùng là MCameraObserver2 vì nó cung cấp các chức năng cộng thêm như là cho phép chụp ảnh mà không cần sao chép bộ đệm và nó hợp nhất sự trình bày của dữ liệu hình ảnh, video và kính ngắm đến ứng dụng khách Tuy nhiên, vì MCameraObserver2 vẫn chưa được hiện thực rộng rãi trên các thiết bị S60 nên tốt hơn hết là người phát triển cũng nên dùng giao diện McameraObserver để có thể tương thích với các điện thoại thông minh S60 đã có
Trước khi cố gắng truy xuất và sử dụng camera trên điện thoại thông minh Symbian, trước hết người phát triển phải kiểm tra sự tồn tại của camera bằng cách
Trang 20sử dụng phương CCamera::CamerasAvailable() , phương thức này trả về
số camera hiện có
Để khởi tạo CCamera, người phát triển chỉ việc gọi CCamera::NewL(), phương thức này nhận tham số đầu vào là trình quan sát McameraObserver hoặc MCameraObserver2, tham số aCameraIndex chỉ rõ chỉ mục của camera
mà ta đang muốn sử dụng
// Xác định số camera đang sẵn có
TInt camerasAvailable = CCamera::CamerasAvailable();
TInt cameraIndex = 0; // t ừ 0 đến camerasAvailable-1
TInt priority = 0; // độ ưu tiên -100 và 100
// T ạo camera với trình quan sát MCameraObserver2
// L ưu ý: lớp hiện tại phải được dẫn xuất từ cả hai trình quan sát // vì v ậy ta có thể bỏ tham chiếu con trỏ "this"
TRAPD(error, iCamera = CCamera::NewL(*this, cameraIndex, priority));
• EOrientationOutwards - camera nằm ở mặt sau điện thoại và thường được dùng để chụp ảnh
Trang 21• EOrientationInwards - camera nằm ở mặt trước điện thoại và thường được dùng để đàm thoại video
• EOrientationMobile - định hướng của camera có thể được thay đổi bởi người dùng; trong trường hợp này, người phát triển không thể tin cậy vào định hướng camera
• EOrientationUnknown - không thể biết được định hướng của camera Thật không may là không có biến liệt kê về việc camera được trang bị kính ngắm định hướng chân dung hay phong Nếu ứng dụng camera không có cùng định hướng với ứng dụng camera chính của thiết bị, API camera sẽ xoay hình ảnh – nhưng độ phân giải sẽ bị hạn chế
Biến iOptionsSupported chỉ số tùy chọn mà camera hỗ trợ Giá trị của biến này được định nghĩa bởi kiểu liệt kê TCameraInfo::TOptions Sau đây
là những giá trị rất hữu ích trong việc chọn camera:
2.1.2.2 Điều khiển camera
Một ứng dụng khách không thể luôn luôn giành được quyền điều khiển camera Nếu có nhiều hơn một ứng dụng khách yêu cầu quyền điều khiển, khi đó hệ điều hành sẽ tính toán độ ưu tiên và quyết định ứng dụng khách nào có thể giành
Trang 22được quyền điều khiển Một ứng dụng có độ ưu tiên cao hơn sẽ giành được quyền kiểm soát camera Có hai phần tạo nên giá trị ưu tiên của một ứng dụng:
• Ứng dụng khách có thể tự khai báo để có thể có giá trị ưu tiên từ -100 đến +100 Giá trị ưu tiên mặc định là 0
• Ứng dụng khách với khả năng MultimediaDD sẽ được ưu tiên trước các ứng dụng không có khả năng này mà không cần quan tâm đến giá trị ưu tiên Phương thức CCamera::Reserve() sẽ không được gọi thành công nếu một ứng dụng khách khác có độ ưu tiên cao hơn đang sử dụng camera: sự gọi về của hàm MCameraObserver2::HandleEvent() sẽ trả về lỗi
Nếu ứng dụng khách được thay thế bởi một ứng dụng khác, nó sẽ nhận được thông báo rằng camera đã được sử dụng Nó sẽ không chờ gọi về cho các yêu cầu chụp ảnh hay thông báo về việc treo các thao tác mở rộng và mọi nỗ lực sử dụng camera đều bị thất bại nếu không gọi được phương thức CCamera::Reserve()
v Điều khiển nguồn
Khi đã có đối tượng camera, ứng dụng khách cần phải mở nguồn của camera lên bằng cách sử dụng phương thức CCamera::PowerOn() Giao diện gọi lại được thông báo khi quá trình mở nguồn hoàn tất Khi callback power-on được nhận, camera đã sẵn sàng để sử dụng, ứng dụng khách có thể bắt đầu thiết lập kính ngắm
và chụp ảnh
Vì sử dụng camera liên tục sẽ tiêu tốn rất nhiều pin, vì vậy người phát triển nên tắt nguồn camera ngay sau khi không còn sử dụng camera nữa bằng cách gọi phương thức CCamera::PowerOff()
void CCameraAppUi::HandleCommandL(TInt aCommand)
Trang 23// Điều khiển phương thức sự kiện từ MCameraObserver2
void CCameraAppUi::HandleEvent(const TECAMEvent& aEvent)
Trang 24v Định dạng ảnh:
Trước khi chụp ảnh, đầu tiên ứng dụng khách phải chỉ rõ định dạng ảnh cần chụp Có một số sự phụ thuộc phức tạp giữa định dạng và kích cỡ khung ảnh, vì vậy định dạng ảnh phải được chỉ rõ như sau:
1 Chọn định dạng từ những định dạng được hỗ trợ từ biến Info ::iImageFormatsSupported
2 Chọn kích cỡ bằng cách sử dụng hàm CaptureSizes() Chú ý rằng không phải tất cả các kích cỡ đều bảo đảm được hỗ trợ cho mọi định dạng
CCamera::Enumerate-v Độ sáng:
Để thay đổi độ sáng của ảnh người lập trình phải:
Trang 251 Kiểm tra xem quyền điều khiển độ sáng có được hỗ trợ hay không bằng cách xét xem cờ TCameraInfo::EBrightnessSupported đã được thiết lập hay chưa
Để thay đổi mức độ phóng đại của camera người lập trình phải:
1 Kiểm tra xem quyền điều khiển độ phóng đại có được hỗ trợ hay không
và đọc giá trị lớn nhất, nhỏ nhất từ biến thành viên trong TCameraInfo Giá trị 0 không được hỗ trợ Ban đầu, độ phóng đại có giá trị nhỏ nhất và sẽ thay đổi tuyến tính cho đến khi đạt giá trị lớn nhất Một tập các giá trị riêng biệt được dành cho độ phóng đại quang học và
độ phóng đại kỹ thuật số TCameraInfo có hai biến thành viên là iMinZoomFactor và iMaxZoomFactor
2 Thiết lập độ phóng đại bằng hàm ZoomFactorL() hay CCamera::SetZoomFactorL()
CCamera::SetDigital-TCameraInfo info;
iCamera->CameraInfo(info);
// thi ết lập zoom quang
TInt minZoom = info.iMinZoom;
TInt maxZoom = info.iMaxZoom;
if (minZoom != 0) // if it is supported
{
// gán giá tr ị từ minZoom đến maxZoom
iCamera->SetZoomFactorL(maxZoom);
Trang 26}
// thi ết lập zoom kỹ thuật số
TInt maxDigitalZoom = info.iMaxDigitalZoom;
iCamera->SetWhiteBalanceL(CCamera::EWBTungsten);
v Độ phơi sáng
Bộ thiết lập trước của độ phơi sáng được cung cấp bởi kiểu liệt kê CCamera::TExposure Trước khi sử dụng nên kiểm tra xem chức năng này có được hỗ trợ hay không bằng cách sử dụng cờ TCameraInfo::iExposure- ModesSupported EExposureAuto là giá trị mặc định và luôn được hỗ trợ
Để thay đổi, gọi hàm SetExposureL():
Trang 272.1.2.3 Hiển thị kính ngắm
Sau khi mở nguồn camera thành công, ta có thể hiển thị kính ngắm Kính ngắm có thể, nếu được hỗ trợ, truyền trực tiếp khung hình từ camera đến bộ nhớ của màn hình tại vị trí mà ứng dụng khách lựa chọn Nếu được hỗ trợ, người phát triển ứng dụng có thể tự hiện thực hàm hiển thị kính ngắm, trong trường hợp đó ứng dụng khách sẽ truyền ảnh từ kính ngắm dưới dạng bitmap theo các khoảng thời gian đều đặn
Khả năng của camera quy định cách thức hiển thị kính ngắm Biến thành viên iOptions của TCameraInfo có thể có một hoặc cả hai thiết lập sau:
• EviewFinderBitmapSupported – người lập trình phải tự biểu diễn kính ngắm từ những ảnh bitmap được cung cấp bởi camera
• EviewFinderDirectSupported – các khung ảnh được truyền trực tiếp từ camera đến bộ nhớ hiển thị tại vị trí mà ứng dụng khách chọn
Cũng có thể là camera không hỗ trợ phương pháp nào cả, vì vậy ta nên kiểm tra xem phương pháp nào được hỗ trợ trước khi cố gắng biểu diễn kính ngắm Ta có thể chỉ rõ phần màn hình mà dữ liệu kính ngắm có thể được truyền đến
v Kính ngắm trực tiếp
Việc biểu diễn kính ngắm trực tiếp, các khung ảnh được truyền trực tiếp từ camera đến bộ nhớ hiển thị tại vị trí mà ứng dụng khách lựa chọn, là phương pháp hiệu quả nhất Việc biểu diễn được thực hiện bằng hệ thống con camera (camera subsystem) và thường được tối ưu để có thể sử dụng trên bất cứ phần cứng nào Để
vẽ kính ngắm trực tiếp, ta dùng phương thức sau:
virtual void StartViewFinderDirectL(RWsSession& aWs,
CWsScreenDevice& aScreenDevice, RWindowBase& aWindow,
TRect& aScreenRect);
Ba tham số đầu tiên có thể được lấy từ môi trường GUI (Graphical User Interface) của ứng dụng; aScreenRect là hình chữ nhật chỉ màn hình vật lý nơi
Trang 28mà kính ngắm sẽ được biểu diễn Một khi hàm StartViewFinderDirectL() được gọi thành công, kính ngắm sẽ được hiển thị ra cho người dùng Ứng dụng không đòi hỏi thêm một hành động nào nữa Chú ý rằng việc truy xuất màn hình trực tiếp sẽ điều khiển vùng hiển thị của màn hình – việc mất tiêu cự không làm ngừng kính ngắm nếu nó được nhìn thấy từng phần
Chế độ kính ngắm này có thể hiệu quả hơn chế độ dựa trên ảnh bitmap vì nó cho phép tối ưu đường dẫn giữa phần cứng camera và trình điều khiển màn hình LCD Tuy nhiên, cho đến gần đây, chế độ này vẫn chưa được hỗ trợ trên tất cả các thiết bị S60
v Kính ngắm dựa trên ảnh bitmap
Khi kính ngắm dựa trên ảnh bitmap được kích hoạt, camera sẽ truyền các ảnh bitmap về cho ứng dụng theo một khoảng thời gian đều đặn và ứng dụng sẽ vẽ chúng lên màn hình khi thích hợp Các ảnh bitmap được truyền với tốc độ đủ nhanh
để có thể đảm bảo rằng sẽ hiển thị được một kính ngắm mượt Thường thì chế độ này không hiệu quả bằng chế độ kính ngắm trực tiếp, nhưng nó cho phép ứng dụng khách thực hiện xử lý ảnh trong các ứng dụng thị giác máy tính hay trò chơi
Để khởi động chế độ kính ngắm dựa trên ảnh bitmap, ta sử dụng phương thức sau:
virtual void StartViewFinderBitmapsL(TSize& aSize);
Phương thức này cần tham số có kiểu Tsize nhằm xác định kích cỡ của ảnh bitmap mà ta nhận được Ta nên thiết lập kích cỡ này bằng với kích cỡ của vùng màn hình mà ta định vẽ kính ngắm Các ảnh bitmap được truyền qua một trong những callback sau:
• ViewFinderReady(MCameraBuffer& aCameraBuffer, TInt aError) – phương thức này được gọi khi ta sử dụng trình quan sát MCameraObserver2 Ảnh bitmap được trình bày bởi lớp McameraBuffer và ta có thể sử dụng phương thức BitmapL() để có
Trang 29thể lấy ảnh có kiểu CFbsBitmap Lớp McameraBuffer có khả năng đóng gói nhiều khung hình đã được mã hóa; cho một kính ngắm, ta nên mong đợi một khung hình đơn, khung hình không được mã hóa dưới dạng một thể hiện của lớp CFbsBitmap
• ViewFinderFrameReady(CFbsBitmap& aFrame) – phương thức này được gọi khi ta sử dụng trình quan sát McameraObserver Ảnh bitmap được truyền là một thực thể của lớp CFbsBitmap, có thể được vẽ trên màn hình theo cách thông thường
TRect screenRect = iAppView->Rect();
TSize size = screenRect.Size();
iCamera->StartViewFinderBitmapsL(size);
}
Luận văn chọn phương pháp này để hiển thị kính ngắm, tuy không hiệu quả bằng phương pháp hiển thị trực tiếp nhưng phương pháp này cho phép người lập trình can thiệp vào những khung ảnh của kính ngắm
2.1.2.4 Chụp ảnh tĩnh
Quá trình chụp ảnh đòi hỏi phải truyền ảnh hiện tại từ camera đến ứng dụng khách Trước khi chụp ảnh tĩnh, ta nên truy vấn các khả năng của camera đang sử dụng Có hai tham số cần phải thiết lập dựa trên các khả năng là: định dạng ảnh và kích thước ảnh
Trang 30v Chọn định dạng ảnh
Các định dạng được hỗ trợ được xác định bởi biến thành viên Info::iImageFormatsSupported của kiểu liệt kê CCamera::TFormat Khi sử dụng camera có hỗ trợ nhiều định dạng, ta cần phải chọn định dạng nào phù hợp với ứng dụng nhất
TCamera-CCamera::TFormat iFormat;
TInt iSizeIndex;
// Kh ởi tạo truy vấn camera để lấy kích cỡ được hỗ trợ
void CCameraDemoAppUi::SelectCaptureModeL(CCamera::TFormat aFormat)
{
iFormat = aFormat;
//iSizeArray là m ảng RArray<TSize> đã được khai báo
for (TInt i=0; i<iInfo.iNumImageSizesSupported; ++i)
Sau đây là những định dạng ảnh có thể được hỗ trợ:
• EFormatJpeg và EFormatExif: đây là những định dạng được mã hóa, cần phải giải mã trước khi hiển thị chúng lên màn hình Dữ liệu được mã hóa trong một chuỗi dữ liệu và ta phải dùng thư viện ICL (Image Conversion Library) để giải mã dữ liệu
Trang 31• EFormatFbsBitmapColorXxx: đây là những định dạng không nén, trong đó ảnh chụp được biểu diễn bằng một đối tượng CFbsBitmap
• EFormatXxBitRGBXxx và EFormatYUVXxx: đây là những định dạng
dữ liệu thô, các đặc tính của chúng được xác định bởi định dạng chính xác,
dữ liệu được lưu trong một chuỗi dữ liệu
Các định dạng được hỗ trợ bởi camera có thể bị ảnh hưởng bởi độ phân giải của camera đó Những camera có độ phân giải cao có khả năng biểu diễn dữ liệu ảnh dưới định dạng nén vì bộ nhớ cần để lưu trữ ảnh dưới dạng không nén là rất lớn Một khi đã lựa chọn xong định dạng sẽ được sử dụng, ta có thể liệt kê các kích thước chụp được hỗ trợ bởi định dạng đó Số lượng kích thước được lưu trong biến TCameraInfo::iNumImageSizesSupported Các kích thước là kết quả trả
về của hàm CCamera::EnumerateCaptureSizes()
v Chuẩn bị chụp ảnh
Trước khi chụp ảnh, ta cần phải chuẩn bị đối tượng CCamera bằng cách sử dụng phương thức PrepareImageCaptureL() Việc này cho phép hệ thống con camera cấp phát đủ bộ nhớ cần thiết và thực hiện các thiết lập khác để chụp ảnh; phương thức này phải được gọi ít nhất một lần trước khi yêu cầu chụp ảnh iCamera->PrepareImageCaptureL(aFormat, aSizeIndex);
Tham số aSizeIndex là chỉ mục của kích thước ảnh mà ta muốn chụp; nó tương ứng với tham số aSizeIndex của phương thức EnumerateCapture-Sizes()
Camera đã sẵn sàng để chụp ảnh sau khi ta đã gọi phương thức PrepareImageCaptureL()thành công Chú ý rằng:
• Những thiết lập ảnh trên chỉ dùng để chụp ảnh
• Phải chuẩn bị camera trước khi chụp ảnh
• Không thể chụp ảnh khi đang kích hoạt chế độ quay phim
Trang 32Trong trường hợp muốn chụp nhiều hơn một ảnh, ta có thể gọi lại phương thức CaptureImage(), tuy nhiên ta không được gọi lại CaptureImage() trước khi:
• Nhận được callback từ ImageBufferReady()
• Hủy quá trình chụp ảnh hiện hành bằng cách gọi Capture()
CancelImage-Ảnh sẽ được đóng gói bởi lớp MCameraBuffer, lớp này cũng được dùng khi nhận ảnh từ kính ngắm Lớp MCameraBuffer có thể lưu trữ dữ liệu ảnh theo nhiều cách và có thể lữu trữ nhiều khung ảnh Khi chụp ảnh tĩnh, lớp này lưu trữ một khung ảnh đơn theo định dạng được yêu cầu
Trang 33Như đã đề cập ở trên, ta có thể chọn định dạng ảnh chụp Nếu ta yêu cầu định dạng EFormatFbsBitmapColorXxx, phương thức McameraBuffer ::BitmapL() sẽ trả về quyền điều khiển thực thể CFbsBitmap đang chứa dữ liệu ảnh Nếu ta yêu cầu định dạng EFormatJpeg hay EFormatExif, chuỗi dữ liệu có thể được giải mã thành thực thể CFbsBitmap bằng cách sử dụng lớp CImageDecoder hoặc ghi trực tiếp dữ liệu ảnh vào tập tin JPEG Đối với những định dạng khác, dữ liệu được biểu diễn dưới dạng chuỗi, dữ liệu có thể được truy xuất bằng phương thức MCameraBuffer::DataL() Sự thể hiện của dữ liệu phụ thuộc vào định dạng mà ta đã yêu cầu
Luận văn này chọn định dạng ảnh là EFormatExif để có thể lưu ảnh chụp vào tập tin JPEG Phương pháp này vừa nhanh vừa tiết kiệm được bộ nhớ dùng để lưu trữ tập tin ảnh đã được chụp
Chú ý rằng, sau khi đã hoàn thành việc xử lý đối tượng MCameraBuffer, ta phải gọi phương thức Release() để tránh bị rò rỉ bộ nhớ Phương thức này giải phóng tất cả bộ nhớ đã được sử dụng và cho phép hệ thống con camera được tái sử dụng bộ nhớ khi cần
Nếu ta đang làm việc với những điện thoại chỉ hỗ trợ McameraObserver chứ không hỗ trợ McameraObserver2, callback tương đương là:
MCameraObserver::ImageReady(CFbsBitmap* aBmp, HBufC8* aData, TInt aError)
CFbsBitmap và con trỏ HBufC8 có thể được xem như là các đối tượng được trả về từ phương thức MCameraBuffer::BitmapL() và phương thức MCameraBuffer::DataL() Chỉ một trong hai tham số này là hợp lệ và được xác định bởi định dạng ảnh đang được sử dụng Trong trường hợp dùng con trỏ, ta phải xóa nó sau khi đã sử dụng để tránh rò rỉ bộ nhớ
v Lưu trữ ảnh
Sau khi đã chụp ảnh, ta phải thực hiện lưu trữ ảnh để làm đầu vào cho các khối khác trong ứng dụng:
Trang 34void StorePicture( TDesC8* aData )
Việc giải quyết bài toán tiền xử lý ảnh của ứng dụng này một cách tổng quát đòi hỏi phải đầu tư rất nhiều thời gian và nguồn nhân lực vì trong khi sử dụng, người dùng có thể chụp ảnh ở trong rất nhiều môi trường, điều kiện ánh sáng khác nhau Trong một ứng dụng nói chung và trong ứng dụng tra từ điển bằng camera trên điện thoại di động này nói riêng chỉ có thể giải quyết bài toán trong một trường hợp cụ thể
Trang 35Trong phạm vi của luận văn này, tôi chỉ thực hiện một số thao tác tiền xử lý ảnh cơ bản đủ để đáp ứng yêu cầu của ứng dụng và cải thiện một phần chất lượng của ảnh chụp Một số thao tác tiền xử lý ảnh được áp dụng: làm mờ ảnh (blur), làm nét ảnh (sharpen) và hiệu chỉnh độ tương phản Mục đích của các thao tác tiền xử lý ảnh này là làm cho phần văn bản trong ảnh được phân biệt rõ nét hơn so với phần nền, việc này giúp nâng cao độ chính xác của khối nhận dạng ký tự quang học Đối với những dòng điện thoại có hỗ trợ chức năng auto focus thì có thể bỏ qua quá trình tiền xử lý ảnh này Sau đó ảnh sẽ được lưu trữ để làm đầu vào cho khối nhận dạng ký tự quang học Trong hình 2.4 là lưu đồ xử lý của khối tiền xử lý ảnh
Trang 36Hình 2.4: Khối tiền xử lý ảnh
Bắt đầu
Ảnh đã được thu nhận
Cắt ảnh
Chuyển đổi định dạng ảnh
Camera có
hỗ trợ auto focus?
Sai Làm mờ
Làm nét
Làm mờ
Làm nét
Điều chỉnh độ tương phản
Kết thúc
Đúng
Trang 372.2.1 Cắt ảnh
Tesseract được xây dựng để nhận dạng ký tự quang học trên những ảnh văn bản cỡ lớn được quét từ văn bản giấy và nó có thể chạy tốt trên máy tính vốn dồi dào tài nguyên (cụ thể là tốc độ CPU và dung lượng RAM) Tuy nhiên, việc này không thể thực hiện được trên môi trường ít tài nguyên như điện thoại di động Vì vậy, luận văn tôi thực hiện giới hạn vùng ảnh chụp và cắt ảnh để giảm tải cho khối OCR, tức là chỉ cho phép người dùng chụp một phần của văn bản giấy theo một vùng đã được định sẵn
Ngoài ra, ứng dụng còn yêu cầu người dùng chỉ định từ cần tra cứu và ứng dụng chỉ tra từ điển từ mà người dùng đã chỉ định dựa vào kỹ thuật phân tích thành phần liên thông trên ảnh chụp
Hình 2.5 mô tả cách ứng dụng giới hạn vùng ảnh chụp và chỉ định từ cần tra Hình chữ nhật màu đỏ sẽ là vùng giới hạn ảnh chụp và chữ thập màu đỏ sẽ chỉ định
từ mà người dùng cần tra cứu Ứng dụng sẽ tiến hành cắt ảnh theo hình chữ nhật màu đỏ
Cắt ảnh là quá trình thực hiện sao chép các điểm ảnh trong vùng chữ nhật giới hạn sang một ảnh mới có kích thước đúng bằng kích thước hình chữ nhật giới hạn
đó
Hệ điều hành Symbian có các API hỗ trợ cho người lập trình thực hiện việc này đó là lớp CimageProcessor và các hàm GetPixel(), SetPixel()
Trang 38processor = ImageProcessorUtility::NewImageProcessorL(*iCropBitmap, aSize, iBitmap->DisplayMode(), ETrue);
CleanupStack::PushL(processor);
processor->PrepareL(*iCropBitmap, TRect(aSize));
for(TInt yPos = pos.iY; yPos < pos.iY + aSize.iHeight; yPos++)
for(TInt xPos = pos.iX; xPos < pos.iX + aSize.iWidth; xPos++)
{ TRgb pixel;
iBitmap->GetPixel(pixel, TPoint(xPos,yPos));
processor->SetPixel(pixel);
} processor->FlushPixels();
Trang 39CFbsBitmap đang được dùng để lưu trữ ảnh đã được chụp iCropBitmap là một biến kiểu CFbsBitmap dùng để lưu trữ kết quả của việc cắt ảnh iCropBitmap sẽ là đầu vào của bước kế tiếp, bước chuyển đổi định dạng ảnh
2.2.2 Chuyển đổi định dạng ảnh
Hệ điều hành Symbian có hỗ trợ nhiều định dạng ảnh khi thực hiện chụp ảnh Tuy nhiên, vì độ phân giải của các camera trên các dòng máy hiện tại là khá lớn nên việc chụp ảnh với định dạng BMP là không hiệu quả, thời gian chụp rất lâu, dung lượng tập tin ảnh lớn Vì vậy, ứng dụng này chỉ chụp ảnh với định dạng JPEG, đây
là định dạng cho hiệu quả cao nhất, dung lượng lưu trữ thấp mà chất lượng ảnh lại cao Ảnh với định dạng JPEG sẽ được cắt và ảnh thu được sẽ được chuyển sang định dạng BMP Lúc này, tốc độ chuyển đổi định dạng sẽ nhanh hơn rất nhiều vì kích thước ảnh đã giảm đi đáng kể sau khi cắt ảnh Lý do cần phải thực hiện việc chuyển đổi này là khối nhận dạng ký tự quang học nhận đầu vào là ảnh với định dạng BMP
Thư viện ICL của hệ điều hành Symbian rất hữu dụng cho việc chuyển đổi định dạng Các ứng dụng chính của thư viện ICL:
• Chuyển đổi ảnh từ các định dạng phổ biến (JPEG, PNG, BMP, GIF,…) sang định dạng bitmap của hệ điều hành Symbian Đây là quá trình giải mã (decode), quá trình này sử dụng API CImageDecoder
• Chuyển đổi ảnh từ định dạng bitmap của hệ điều hành Symbian sang các định dạng phổ biến Đây là quá trình mã hóa (encode), quá trình này sử dụng API CImageEncoder
• Thực hiện một số phép biến đổi trên ảnh như: quay ảnh, co giãn ảnh,… trên các định dạng ảnh khác nhau
Sau đây là hàm dùng để mã hóa ảnh từ định dạng bitmap của hệ điều hành Symbian (CFbsBitmap) sang định dạng bitmap thông thường (của hệ điều hành Windows) với đầu vào là iCropBitmap đã được đề cập ở phần trước:
void CImageHandler::EncodeToBmpL(const TFileName& aFileName)
{
Trang 40và làm giảm chi tiết trong ảnh Kỹ thuật này gây hiệu ứng tương tự như việc nhìn ảnh qua một màn hình mờ Kỹ thuật làm mờ ảnh Gauss cũng được dùng như là một bước tiền xử lý trong các thuật toán thuộc lĩnh vực thị giác máy tính nhằm mục đích cải thiện cấu trúc ảnh ở nhiều mức độ co giãn khác nhau
Vì biến đổi Fourier của một hàm Gauss là một hàm Gauss khác nên việc áp dụng kỹ thuật làm mờ ảnh Gauss có tác dụng làm giảm những thành phần có tần số cao trong ảnh; do đó, kỹ thuật làm mờ ảnh Gauss là một bộ lọc thông thấp (low pass filter) Về mặt toán học, việc áp dụng kỹ thuật làm mờ ảnh Gauss vào một ảnh cũng tương tự như việc thực hiện phép tích chập (convoltion3) ảnh đó với một hàm Gauss