Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
1,09 MB
Nội dung
TRƯỜNG ĐẠI HỌC QUẢNG BÌNH KHOA KỸ THUẬT – CƠNG NGHỆ THÔNG TIN & ĐỀ TÀI ỨNG DỤNG XỬ LÝ ẢNH TRONG THỰC TẾ VỚI THƯ VIỆN OPENCV C/C++ Giảng viên hướng dẫn: TS Hoàng Văn Thành Người thực hiện: Nguyễn Tiến Dũng Lớp: Đại học Công nghệ thông tin K61 (LT) Đồng Hới, ngày 21 tháng 05 năm 2021 MỤC LỤC MỤC LỤC LỜI MỞ ĐẦU .3 PHẦN I: MỞ ĐẦU LÝ DO CHỌN ĐỀ TÀI .4 MỤC TIÊU CỦA ĐỀ TÀI ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU 4 PHƯƠNG PHÁP NGHIÊN CỨU Chương I: Làm quen với thư viện OpenCV Giới thiệu thư viện OpenCV Phiên OpenCV hay OpenCV 2? Chương II: Các phép xử lý ảnh ứng dụng .7 Không gian màu, chuyển đổi không gian màu .7 a Không gian màu RGB b Không gian màu CMYK c Không gian màu HSV Chuyển đổi không gian màu a Chuyển đổi RGB sang CMYK ngược lại b Chuyển đổi RGB sang HSV ngược lại .9 Điều chỉnh độ sang độ tương phản ảnh 10 Ảnh nhị phân, nhị phân hóa với ngưỡng động 11 Histogram, cân histogram ảnh 13 Phóng to, thu nhỏ xoay ảnh 13 Lọc số ảnh 13 Chương III: Lập trình xử lý ảnh với giao diện MFC 16 Giới thiệu MFC .16 Khởi tạo project MFC 16 Làm việc với điều khiển (Control) MFC .19 Chuyển đổi kiểu liệu MFC 22 Chương trình tải ảnh hiển thị ảnh giao diện MFC 23 PHẦN II: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 32 Đánh giá kết đạt 32 Hạn chế 32 Hướng phát triển 32 LỜI MỞ ĐẦU Xử lý ảnh thị giác máy lĩnh vực mà ngày phát triển ứng dụng rộng rãi nhiều lĩnh vực khác nhờ vào phát triển ngày mạnh mẽ hệ thống máy tính, thuật tốn cơng trình nghiên cứu khác nhiều nhà khoa học giới Ở Việt Nam, ứng dụng xử ảnh bước đầu triển khai số lĩnh vực lắp đặt hệ thống nhận dạng biển biển số xe bãi đổ xe, hệ thống nhận dạng vân tay chấm công công sở… môn học xử lý ảnh trường đại học xem môn học bắt buộc số ngành công nghệ thông tin, điện tử viễn thông… Tuy nhiên nhìn cách khách quan số lượng ứng dụng triển khai thực tế ỏi, lĩnh vực phát triển mạnh mẽ tương lai quan tâm cách nghiêm túc Xuất phát từ thực tế môn học xử lý ảnh trường đại học mơn học mang nặng tính học thuật, khơ khan, vấn đề mơ tả dạng tốn học, thêm vào số lượng tài liệu chuyên ngành tiếng Việt không nhiều, làm đề tài “Ứng dụng xử lý ảnh thực tế với thư viện OpenCV” Đề tài đề cập tới số phần lĩnh vực xử lý ảnh thị giác máy, thông qua diễn giải trực quan, có nhìn tổng qt, hiểu khái niệm biết vấn đề ứng dụng vào thực tế Các chủ đề cuôn sách kèm với chương trình mơ viết ngơn ngữ C++ với giúp đỡ thư viện OpenCV, thư viện mã nguông mở đánh giá mạnh mẽ tốc độ xử lý đáp ứng ứng dụng thời gian thực Tài liệu chia thành bốn phần, phần đầu giới thiệu thư viện OpenCV, phần thứ hai nói số vấn đề chọn lọc thường gặp xử lý ảnh không gian màu, lọc, cách phát đường thẳng đường trịn ảnh …, phần thứ ba nói số thủ thuật để lập trình với thư viện MFC phần cuối nói số ứng dụng thực tế toán nhận dạng biển số xe … Thư viện OpenCV OpenCV 2.4.3, OpenCV khác tùy chỉnh lại chút nhiên chất vấn đề tương đối giống Ngơn ngữ lập trình cho ví dụ C/C++, IDE sử dụng Visual Studio 2010 Tuy nhiên đa số chương trình tách biệt phần xử lý vào file *.cpp nên ta lấy để áp dụng vào trình dịch khác PHẦN I: MỞ ĐẦU LÝ DO CHỌN ĐỀ TÀI Cùng với phát triển khoa học kỹ thuật, nhu cầu người ngày tăng, việc để tạo ảnh đẹp thỏa mãn cho người lưu giữ lại kỉ niệm điều thiếu với mong muốn: + Chất lượng hình ảnh cao + Tính tiện lợi, dễ lưu trữ Với việc phát triển công nghệ thông tin, liệu đa phương tiện ngày tăng Việc có phần mềm xử lý ảnh phục vụ cho nhu cầu người điều tất yếu MỤC TIÊU CỦA ĐỀ TÀI + Tìm hiểu ngơn ngữ lập trình C/C++ + Tìm hiểu trình nhận dạng xử lý ảnh + Tìm hiểu thư viện OpenCV qua ứng dụng việc tạo phần mềm xử lý ảnh ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU Đối tượng nghiên cứu: + Thư viện OpenCV trình xử lý ảnh + Ngơn ngữ lập trình C/C++ Phạm vi nghiên cứu: + Ứng dụng trình xử lý ảnh với MFC (Microsoft Foundation Classes) PHƯƠNG PHÁP NGHIÊN CỨU Phương pháp tham khảo tài liệu + Thu thập, đọc hiểu, phân tích thơng tin, liệu từ tài liệu, giáo trình, sách liên quan đến nhận dạng xử lý ảnh + Các tài liệu liên quan đến nhận dạng xử lý ảnh Phương pháp thực hành: + Tìm hiểu giải thuật nhận dạng xử lý ảnh, sử dụng thư viện Opencv ngôn ngữ lập trình C/C++ để lập trình xử lý ảnh với phần mềm MFC (Microsoft Foundation Classes) Chương I: Làm quen với thư viện OpenCV Giới thiệu thư viện OpenCV OpenCV (Open Source Computer Vision) thư viện mã nguồn mở thị giác máy với 500 hàm 2500 thuật toán đư ợc tối ưu xử lý ảnh, vấn đề liên quan tới thị giác máy OpenCV thiết kế cách tối ưu, sử dụng tối đa sức mạnh dòng chip đa lõi… để thực phép tính tốn thời gian thực, nghĩa tốc độ đáp ứng đủ nhanh cho ứng dụng thông thường OpenCV thư viện thiết kế để chạy nhiều tảng khác (cross-patform), nghĩa chạy hệ điều hành Window, Linux, Mac, iOS … Việc sử dụng thư viện OpenCV tuân theo quy định sử dụng phần mềm mã nguồn mở BSD bạn sử dụng thư viện cách miễn phí cho mục đích phi thương mại lẫn thương mại Dự án OpenCV khởi động từ năm 1999, đến năm 2000 giới thiệu hội nghị IEEE vấn đề thị giác máy nhận dạng, nhiên OpenCV 1.0 tới tận năm 2006 thức công bố năm 2008 1.1 (pre-release) đời Tháng 10 năm 2009, OpenCV hệ thứ hai đời (thường gọi phiên 2.x), phiên có giao diện C++ (khác với phiên trước có giao diện C) có nhiều điểm khác biệt so với phiện thứ Thư viện OpenCV ban đầu hỗ trợ từ Intel, sau hỗ trợ bở Willow Garage, phịng thí nghiệm chun nghiên cứu cơng nghệ robot Cho đến nay, OpenCV thư viện mở, phát triển nguồn quỹ không lợi nhuận (none -profit foundation) hưởng ứng lớn cộng đồng Phiên OpenCV hay OpenCV 2? Cho tới nay, trải qua năm từ lúc phiên OpenCV cơng bố, có nhiều phiên OpenCV đời, nhiên chia thư viện thành hai dựa đặc điểm khác biệt lớn chúng: phiên OpenCV hệ thứ (hay gọi phiên OpenCV 1.x) phiên OpenCV thứ hai (hay gọi phiên OpenCV 2.x) Sau ta số điểm khác biệt hai phiên OpenCV 1.x (bao gồm 1.0 pre-release 1.1) dựa giao diện C, cấu trúc ảnh số dựa cấu trúc IplImage, thư OpenCV 2.x dựa giao diện C++, cấu trúc ảnh số, ma trận dựa cấu trúc cv::Mat Trong OpenCV 1.x, người sử dụng phải hoàn toàn quản lý nhớ đối tượng, nghĩa đối tượng tạo ra, ta phải ý để giải phóng khơng cịn sử dụng (trong nhiều trường hợp bị tràn nhớ không ý này), thư viện OpenCV 2.x việc quản lý nhớ trở nên dễ dàng nhờ hàm hủy các lớp đối tượng OpenCV 2.x thực điều đối tượng khơng cịn sử dụng Việc viết dòng lệnh để thực chức OpenCV 2.x dễ dàng nhiều so với OpenCV 1.x, phần là giao diện C++ có phần dễ hiểu so với C, phần hàm OpenCV 2.x tối ưu hóa nhiều bước trung gian khơng cần thiết mặt giao diện người sử dụng Thư viện OpenCV 1.x chứa lượng lớn hàm xử lý thuật tốn, nhiên dạng sơ khai Thư viện OpenCV 2.x bổ xung nhiều hàm, thuật toán tối ưu nhiều đặc biệt khía cạnh phát đối tượng (detection), nhận dạng đối tượng (partten regconition) theo dỗi đối tượng (tracking) Hơn nữa, có giao diện C++ OpenCV 2.x phần giao diện C để tương thích với phiên OpenCV 1.x … Từ số đặc điểm ta thấy thư viện OpenCV phiên 2.x có nhiều điểm trội so với phiên 1.x, Tuy nhiên số trường hợp hệ thống nhúng mà trình dịch đơn chấp nhận ngơn ngữ C phiển 1.x giá trị Trong sách này, nội dung cài đặt, thuật toán, ứng dụng … dành cho OpenCV phiên 2.x tảng hệ điều hành Window Chương II: Các phép xử lý ảnh ứng dụng Không gian màu, chuyển đổi không gian màu Không gian màu mơ hình tốn học dùng để mơ tả màu sắc thực tế biểu diễn dạng số học Trên thực tế có nhiều khơng gian màu khác mơ hình để sử dụng vào mục đích khác Trong ta tìm hiểu qua ba khơng gian màu hay nhắc tới ứng dụng nhiều, hệ không gian màu RGB, HSV CMYK a Không gian màu RGB RGB không gian màu phổ biến dùng đồ họa máy tính nhiều thiết bị kĩ thuật số khác Ý tưởng không gian màu kết hợp màu sắc bản: màu đỏ (R, Red), xanh lục (G, Green) xanh lơ (B, Blue) để mô tả tất màu sắc khác Nếu ảnh số mã hóa 24bit, nghĩa 8bit cho kênh R, 8bit cho kênh G, 8bit cho kênh B, mỗ kênh màu nhận giá trị từ 0-255 Với giá trị khác kênh màu kết hợp với ta màu khác nhau, ta có tổng cộng 255x255x255 = 1.66 triệu màu sắc Ví dụ: màu đen kết hợp kênh màu (R, G, B) với giá trị tương ứng (0, 0, 0) màu trắng có giá trị (255, 255, 255), màu vàng có giá trị (255, 255, 0), màu tím đậm có giá trị (64, 0, 128) Nếu ta dùng 16bit để mã hóa kênh màu (48bit cho tồn kênh màu) dãi màu trãi rộng lên tới 3*2^16 = Một số lớn b Không gian màu CMYK CMYK không gian màu sử dụng phổ biến ngành công nghiệp in ấn.Ý tưởng hệ không gian dùng màu sắc để phục vụ cho việc pha trộn mực in Trên thực tế, người ta dùng màu C=Cyan: xanh lơ, M=Magenta: hồng xẫm, Y=Yellow: vàng để biểu diễn màu sắc khác Nếu lấy màu hồng xẫm cộng với vàng màu đỏ, màu xẫm kết hợp với xanh lơ cho xanh lam Sự kết hợp màu cho màu đen, nhiên màu đen khơn phải đen tuyệt đối thường có độ tương phản lớn, nên ngành in, để tiết kiệm mực in người ta thêm vào màu đen để in chi tiết có màu đen thay phải kết hợp màu sắc Và ta có hệ màu CMYK chữ K để kí hiệu màu đen (Black), có nhẽ chữ B dùng để biểu diễn màu Blue nên người ta lấy chữ cuối K để biểu diễn màu đen? Nguyên lý làm việc hệ màu sau : Trên giấy trắng, màu in lên loại bỏ dần thành phần màu trắng màu C, M, Y khác in theo tỉ lệ khác loại bỏ thành phần cách khác cuối cho ta màu sắc cần in Khi cần in màu đen, thay phải in màu người ta dùng màu đen để in lên Nguyên lý khác với nguyên lý làm việc hệ RGB chỗ hệ RGB kết hợp thành phần màu, hệ CMYK loại bỏ lẫn thành phần màu c Không gian màu HSV HSV gần tương tự HSL không gian màu dùng nhiều việc chỉnh sữa ảnh, phân tích ảnh phần lĩnh vực thị giác máy tính Hệ khơng gian dựa vào thông số sau để mô tả màu sắc H = Hue: màu sắc, S = Saturation: độ đậm đặc, bảo hòa, V = value: giá trị cường độ sáng Không gian màu thường biểu diễn dạng hình trụ hình nón Theo đó, theo vòng tròn từ -360 độ trường biểu diễn màu sắc(Hue) Trường màu đỏ (red primary) tới màu xanh lục (green primary) nằm khoảng 0-120 độ, từ 120 - 240 độ màu xanh lục tới xanh lơ (green primary – blue primary) Từ 240 - 360 từ màu đen tới lại màu đỏ Khơng gian màu HSV Hình tròn biểu diễn màu sắc (HUE) Chuyển đổi không gian màu a Chuyển đổi RGB sang CMYK ngược lại Như nói trên, thành phần K thành phần phụ dùng để in cho điểm màu có màu đen hệ CYMK, để chuyển không gian màu từ RGB sang CMYK trước hết ta chuyển RGB sang CMY sau tìm thành phần K cịn lại Cơ ng thức chuyển từ RGB sang CMY: (C', M', Y') = ((255 - R), (255 - G), (255 - B)) Việc tính giá trị K lại vấn đề khác liên quan tới nhà sản xuất công nghệ in, nhiên mặt lý thuyết chấp nhận K = {C'/2,55, M'/2,55, Y'/2,55} , 0 Project (hoặc nhấn Ctrl + Shift + N) Hộp thoại New Project ra, họn Visual C++ (có thể phải chọn mục Other langguge trước hiển Visual C++) sau chọn MFC Application Ta đặt tên cho project trường Name (giả sử tên xyz) sau click OK để đến bước Ở bước tiếp theo, tiếp tục chọn Next ta hộp thoại sau Application type chọn Dialog based, Project type chọn MFC standard… Chú ý việc tick vào chọn Use Unicode libraries có ý nghĩa cách dùng khác nhau, ta xét trường hợp sau Ta nhấn next để tới hộp thoại tiếp theo, hộp thoại cho phép ta tùy chỉnh số chức cửa sổ có thêm nút phóng to, thu nhỏ, menu… để mặc định chọn next Ta nhấn Next để tới tùy chỉnh tiếp số tùy chọn nâng cao, chưa hiểu rõ ta để mặc định nhấn Next Hộp thoại cuối xuất yêu cầu ta chọn để MFC khởi tạo lớp Ta chọn CxyzDlg nhấn Finish Đến ta khởi tạo xong project MFC có dựa Dialog, Dialog mặc đinh có button OK, button Cancel label, ta để sử dụng xóa thiết kế theo ý riêng Làm việc với điều khiển (Control) MFC Đặt tên biến cho control Khi muốn sử dụng Control nào, ta kéo control từ Toolbox cho vào dialog Để làm việc với control cách dễ dàng, ta nê đặt tên biến cho control Để đặt tên biến cho control, ta click chuột phải vào control, sau chọn Add Variable Một hộp thoại Add Member Variable Wizard mục variable name ta đặt tên cho control Chú ý control mà ID có dạng IDC_STATIC (như Static Text) ta đặt tên biến đổi ID nó, chẳng hạn đổi thành IDC_STATIC1, IDC_LABEL … Ta tùy chỉnh để trình dịch build theo chế độ Unicode Multibyte cách vào Project -> Properties (hoặc nhấn Alt + F7), hộp thoại Properties ra, chọn Configuration Properties -> General tùy chỉnh mục Character Set Lấy giá trị lựa chọn từ Combo Box Combo box cho phép ta lựa chọn, chuyển đổi lựa chọn cách nhanh chóng Để thêm lựa chọn vào Combo Box ta điển trực tiếp vào mục Data properties Để xem lựa chọn chọn, ta dùng hàm GetCurSel() Dialog mở file lưu file Mục đích loại dialog tạo hộp thoại cho phép người dùng chọn đến đường dẫn để mở file lưu file Kết cuối mà ta quan tâm lấy đường dẫn mà người dùng lựa chọn Filter lọc hiển thị file tương ứng mà ta cần quan tâm, trường hợp ta xét mở lưu file ảnh ta để file mở rộng bmp jpg Nếu muốn hiển thị tất loại file ta việc để filter *.*, hộp thoại mở file lưu file khác thông số tạo đối tượng dlg, mở file ta đặt TRUE, lưu file ta đặt FALSE Xử lý kiện click chuột vào button Hầu hết control MFC có nhiều kiện người dùng tương tác với nó, chẳng hạn kiện click chuột vào button, kiện kéo trượt slider control … Để xử lý kiện cho control, mục properties control tương ứng ta chọn vào icon kiện sau chọn sựkiện cần xử lý Thêm menu vào chương trình, xử lý kiện click vào menu Menu MFC xem resource chương trình Việc thêm menu vào dialog địi hỏi ta phải thêm vào resource chương trình Trước hết ta hiển thị cửa sổ xem resource chương trình cách từ menu Visual Studio chọn View -> Resource View (hoặc nhận tổ hợp phìm Ctrl + Shift + E) Cửa sổ Resource View ra, ta click chuột phải vào đó, chọn Add->Resource… Cửa sổ Add Resource ra, ta chọn Menu click vào button New Ngay sau ta có resource chứa menu chống, ta tiến hành điền tên menu mà ta muốn chương trình thực Hình bên ta điền menu chưc nhỏ Open, Save Exit… Khi tạo xong menu, nằm resource chương trình, muốn menu gắn vào dialog chạy, ta vào properties dilog, mục Menu chọn IDR_MENU1, với IDR_MENU1 ID menu ta vừa tạo Để xử lý kiện click chuột menu nào, ta click chuột phải vào mune chọn Add Event Handler… Ở hộp thoại Event Handler Wizard ta chọn lớp mà ta muốn thêm menu vào sau click vào button Add and Edit để tới hàm xử lý kiện click vào menu, ví dụ sau ta gọi hàm OnCancel() để khỏi chương trình Ngồi số điều khiển thông dụng nhắc tới trên, MFC cung cấp nhiều điều khiển khác giúp cho việc tạo giao diện cách dễ dàng đẹp mắt Bạn đọc tham khảo thêm tài liệu khác phần Chuyển đổi kiểu liệu MFC Các kiểu liệu MFC giống với kiểu liệu C, nhiên có số trường hợp ta phải chuyển đổi qua lại kiểu liệu để phù hợp với đầu vào, đầu việc đó, chẳng hạn ta dùng CFileDialog để mở đường dẫn sau đọc ảnh từ đường dẫn này, kết trả đường dẫn CFileDialog chuỗi CString nhiên hàm cv::imread lại đọc ảnh từ chuỗi string, ta phải chuyển đổi từ CString sang string Một số chuyển đổi sau hữu ích cho việc hiển thị giao diện, lấy liệu từ giao diện người dùng Chương trình tải ảnh hiển thị ảnh giao diện MFC Ta tạo project, đặt tên project HienThiThongTinAnh thiết kế giao diện hình sau: Trong hàm trên, ta kiểm tra xem ảnh tải bước hay chưa, chưa thơng báo chưa tải ảnh, tải ảnh tính tốn chiều dài, chiều rộng, kênh màu ảnh … sau hiển thị thơng tin lên label tương ứng Để lên label điều khiển MFC ta dùng thuộc tính SetWindowText() Tuy nhiên đối số đầu vào hàm lại có định dạng CString, giá trị int, float, double muốn hiển thị điều khiển MFC ta phải chuyển đổi kiểu liệu nói Ở button Thoat, click vào vào chương trình ra, việc khỏi chương trình đơn giản, đạt cách gọi hàm OnCancel() Kết chạy chương trình sau:hoặc nữa) ta cần phải tối ưu hóa phép xử lý tới mức để video chạy thời gian thực (khơng bị giật cục, tắc hình) Thư viện OpenCV xử lý video Thư viện OpenCV hỗ trợ ta hàm để bắt ảnh từ thiết bị webcam, camera…, ghi frame ảnh thành file video, cịn việc làm xử lý video ta sử dụng hàm xử lý ảnh mà thư viện cung cấp để xử lý frame video Tuy nhiên, thư viện OpenCV thư viện chuyên xử lý ảnh, nên hỗ trợ track video cấu trúc file video nói trên, nghĩa thu video, ghi video ta có phẩn hình (video stream) mà nghe phần tiếng Một hạn chế ban đầu OpenCV hỗ trợ để làm việc video avi khơng nén, điều làm cho việc kích thước việc lưu trữ file tăng lên nhiều, giả sử ta cần ghi đoạn video avi không nén thời gian phút với tốc độ 25 hình/giây ảnh thu từ webcam có kích thức 640x480 (ảnh màu, kênh màu pixel bit) kích thước file cần phải có 1*60*25*640*480*3*8 = 11059200000 bit tức khoảng 1Gb Tuy nhiên, ta làm việc nhiều dạng file avi nén, file mpeg, flv… miễn máy có cài codec tương ứng Tạo chương trình MyCam Chương trình tạo dựa Dialog MFC, hàm xử lý ảnh OpenCV biết Ta chia chương trình làm hai phần, phần chứa hàm xử lý ảnh phần thuộc giao diện MFC Phần chứa hàm xử lý ảnh đặt tên lớp MyCamCore, bao gồm file header định nghĩa giao diện hàm mycamcore.h file cài đặt mycamcore.cpp Cấu trúc hai file có dạng sau: Mycamcore.h: #pragma once #include class MyCamCore { public: MyCamCore(void); ~MyCamCore(void); void Gray(cv::Mat&, cv::Mat&); void Invert(cv::Mat&, cv::Mat&); void ToHSV(cv::Mat&, cv::Mat&); void Blur(cv::Mat&, cv::Mat&); … … }; Và mycamcore.cpp: #include "MyCamCore.h" #include #include ... (trương hợp in màu đen) Nếu 0< K < 100: C = (C'/2.55 - K) * 100 /(100 - K), M = (M'/2.55 - K) * 100 / (100 - K), Y = (Y'/2.55 - K) *100 /(100 - K) K = K Trong đó, C, M, Y, K làm tròn tới để lấy... gian HSV sau: Đặt M = Max(R, G, B), m = Min(R, G, B) C = M - m Nếu M = R, H' = (G - B)/C mod Nếu M = G, H' = (B - R)/C + Nếu M = B, H' = (R - G)/C + Và H = H'x60 Trong trường hợp C = 0, H = 00 V... nón Theo đó, theo vịng tròn từ -3 60 độ trường biểu diễn màu sắc(Hue) Trường màu đỏ (red primary) tới màu xanh lục (green primary) nằm khoảng 0-1 20 độ, từ 120 - 240 độ màu xanh lục tới xanh lơ