MỤC LỤC MỤC LỤC 1 DANH MỤC HÌNH ẢNH 2 A. ĐẶT VẤN ĐỀ 3 1. Tính cấp thiết hiện nay 3 2. Mục tiêu đề tài 3 B. NỘI DUNG 4 1. Cơ sở lí thuyết 4 2.1. Giới thiệu về nhận dạng và xử lý hình ảnh 4 2. Các ngôn ngữ lập trình, khả năng đồ họa và xuất nhập dữ liệu 6 2.2. Ngôn ngữ Java 6 2.3. Ngôn ngữ C 7 2.4. Ngôn ngữ Python 7 2.5. Ngôn ngữ C++ 8 2.6. Lựa chọn các ngôn ngữ trong các khâu tiếp theo 9 3. Khâu xử lý hình ảnh 9 3.1. Tìm hiểu các khái niệm cơ bản trong xử lí ảnh số 9 3.2. Cài đặt thư viện OpenCV vào project Visual studio 11 3.3. Lập trình xử lí ảnh số để phát hiện ra các vật hình tròn màu trắng và xác định tọa độ tâm 11 4. Khâu thiết kế không gian hiển thị, mô phỏng vật thể trong không gian 15 4.1. Truy xuất dữ liệu với Apache POI 15 4.2. Hiển thị đồ họa 3D trên Java sử dụng thư viện JOGL 23 4.3. Xuất bản ứng dụng trong Java 26 5. Kết quả 33 5.1. Kết quả hiển thị 33 5.2. Kết quả so mới mục tiêu đề ra 36 C. KẾT LUẬN 37 D. TÀI LIỆU THAM KHẢO 38 PHỤ LỤC 39 DANH MỤC HÌNH ẢNH Hình 1Các bước cơ bản trong xử lí ảnh 9 Hình 2 Thư viện OpenCV 3.0 sau khi giải nén 11 Hình 3 Khởi tạo Project mới với Visual Studio 11 Hình 4 Tích hợp OpenCV vào Project (1) 12 Hình 5 Tích hợp OpenCV vào Project (2) 12 Hình 6 Tích hợp OpenCV vào Project (3) 13 Hình 7 Các tiếp đầu ngữ trong Apache POI 15 Hình 8 Các đối tượng trong Apache POI Excel 16 Hình 9 Chọn main class trong project 25 Hình 10 Clean and build file .jar 26 Hình 11 Hoàn thành tạo file jar 26 Hình 12 Kiểm tra việc chạy file jar 27 Hình 13 Mở giao diện phần mềm lauch4j 28 Hình 14 Đặt tên cho file exe 29 Hình 15 Thêm file jar 30 Hình 16 Thêm icon cho file exe 30 Hình 17 Tạo file exe 31 Hình 18 Chạy thử file exe 32 Hình 19 Chọn vị trí lưu file 32 Hình 20 Kết quả thực hiện chương trình 33 Hình 21 Kết quả truy xuất dữ liệu từ file Excel 34 Hình 22 Kết quả hiển thị đồ họa 3D 34 Hình 23 Giao diện của ứng dụng 35 A. ĐẶT VẤN ĐỀ 1. Tính cấp thiết hiện nay Xương là một bộ phận rắn bên trong tạo thành một bộ khung vững chắc nâng đỡ toàn bộ cơ thể, và làm hỗ trợ cho các thành phần khác trong cơ thể. Xương có 3 nhiệm vụ chủ yếu: nâng đỡ, bảo vệ và vận động. Ngoài ra, xương cũng là kho dự trữ chất khoáng (Canxi và Photpho); tủy xương là nơi tạo huyết và sản sinh ra huyết cầu. Ngày nay, việc hoạt động thể thao mạnh, thường xuyên tập thể hình hay làm những việc nặng gây áp lực lên khớp xương…tạo nên nguy cơ gây thương tổn cho cơ thể. Thương tổn ảnh hưởng trực tiếp lên xương, cơ bắp, sụn khớp và mô liên kết cũng như day chằng. Hầu hết thương tổn đều có hình thành từ trước và có thể dự phòng tái phát, nên không cần thiết phải ngưng hẳn các hoạt động thể thao hay cơ bắp trong thời gian dài. Tuy nhiên, nếu không nhận thức được đúng đắn về mức độ thương tổn và xem nhẹ tình hình lâu ngày có thể dẫn đến mãn tính và trở nên khó chữa trị. Những chấn thương về xương khớp luôn là vấn đề mà ngành Y thường xuyên phải đối mặt. Ngày nay, phương pháp hữu hiệu nhất để phát hiện những tổn thương của hệ cơ xương đó là sử dụng máy chụp X Quang. Tuy nhiên, phương pháp này sử dụng tia X có thể gây hại cho bệnh nhân, khi mà tia X cũng là một loại tia có hại cho cơ thể. Dù rằng ngày nay đã có nhiều phương pháp để giảm tác động của tia X, những tác động của tia X tới cơ thể là điều không thể tránh khỏi khi sử dụng nó trong chẩn đoán. Chính vì thế, chúng em đã nghiên cứu để có thể đưa ra hệ thống mô phỏng xương người sử dụng Camera. 2. Mục tiêu đề tài Đề tài chúng em thực hiện lần này mục đích tìm hiểu và thiết kế được một phần mềm mô phỏng chuyển động của một mẫu vật 3D đơn giản lấy dữ liệu từ file excel. Dữ liệu file Excel là kết qảu của khâu xử lí hình ảnh từ việc nhận dạng và vẽ tọa độ của vật thể trong không gian từ việc đặt các camera quay vật thể Thiết kế phần mềm bằng các ngôn ngữ lấp trình thông dụng dễ tìm hiểu, dễ xử lí nhất.
NỘI DUNG
Cơ sở lí thuyết
2.1 Giới thiệu về nhận dạng và xử lý hình ảnh
2.1.1 Tìm hiểu về công nghệ và xử lý hình ảnh
Công nghệ nhận dạng hình ảnh đang có tiềm năng lớn trong nhiều ngành công nghiệp và được áp dụng bởi các công ty hàng đầu như Tesla, Google, Uber, và Adobe Systems Theo thống kê gần đây, thị trường toàn cầu cho công nghệ này dự kiến sẽ đạt 38,92 tỷ USD vào năm 2021, cho thấy sự phát triển mạnh mẽ và sự hiện diện rộng rãi của nó trên toàn thế giới.
Ngày càng nhiều ứng dụng imagetech sử dụng công nghệ nhận dạng hình ảnh cho nhiều mục đích khác nhau trong kinh doanh Sự phát triển của công nghệ này được hỗ trợ bởi các công cụ mã nguồn mở, giúp lập trình trở nên dễ dàng và chi phí phải chăng hơn Các khung công tác và thư viện mã nguồn mở cho phép các công ty tận dụng công nghệ nhận dạng hình ảnh một cách hiệu quả Các cơ sở dữ liệu mở lớn như Pascal VOC và ImageNet cung cấp hàng triệu hình ảnh được gắn thẻ, hỗ trợ các công ty phát triển ứng dụng và thuật toán học máy Đối với các nhà phát triển chuyên nghiệp, thư viện OpenCV là nguồn tài nguyên quan trọng cho nhận dạng hình ảnh thời gian thực, bên cạnh các thư viện khác như OpenNN và VXL.
Trước khi khám phá sâu về nhận dạng hình ảnh và cách xử lý, chúng ta cần nhận thức rằng hình ảnh có nhiều ứng dụng khác nhau Trong lĩnh vực phát triển phần mềm di động, web và các ứng dụng phần mềm, hình ảnh được sử dụng cho nhiều mục đích đa dạng.
Định vị các bản sao (chính xác hoặc một phần)
Tìm kiếm hình ảnh theo phân đoạn
Xử lý hình ảnh (Retouch , )
Cải thiện ứng dụng di động UX
Tính ứng dụng của phân tích hình ảnh đang phát triển mạnh mẽ nhờ vào các tiến bộ công nghệ, mang lại nhiều cơ hội mới cho doanh nghiệp Các giải pháp nguồn mở và công cụ học sâu (deep learning) đã nâng cao khả năng phân tích hình ảnh lên một tầm cao mới.
Nhận dạng hình ảnh, hay tầm nhìn máy tính, là kỹ thuật tự động hóa các nhiệm vụ mà hệ thống thị giác của con người thực hiện Các hệ thống như TensorFlow của Google, DeepFace của Facebook và Dự án Oxford của Microsoft là những ví dụ tiêu biểu về công nghệ học sâu trong nhận dạng hình ảnh Đồng thời, các API như Google Cloud Vision, Clarifai và Imagga giúp doanh nghiệp tiết kiệm chi phí phát triển Các dịch vụ mã nguồn mở mang lại nhiều lợi ích, cho phép xử lý nhận dạng hình ảnh trên đám mây, nâng cao hiệu quả và giảm chi phí hoạt động Các nhà phát triển nội bộ có thể dễ dàng tích hợp API vào ứng dụng mà không gặp khó khăn Hơn nữa, các API mở này cũng tạo cơ hội cho việc phát triển doanh nghiệp trong lĩnh vực nhận dạng hình ảnh Có nhiều phương pháp nhận diện hình ảnh như sử dụng X-quang, sóng siêu âm, tia hồng ngoại và camera; trong dự án này, chúng tôi chọn sử dụng camera để thực hiện nhận diện hình ảnh.
2.1.3 Kỹ thuật xử lý hình ảnh
Xử lý ảnh bao gồm nhiều giai đoạn như nhập ảnh, phân tích, thao tác và tạo ảnh Có hai phương pháp chính là xử lý ảnh kỹ thuật số và analog, trong đó bài viết này tập trung vào kỹ thuật xử lý ảnh kỹ thuật số và các ứng dụng của nó.
Thuật toán máy tính là yếu tố then chốt trong xử lý hình ảnh kỹ thuật số, giúp các nhà phát triển thực hiện nhiều tác vụ quan trọng như phát hiện, phân tích, xây dựng lại và khôi phục hình ảnh Ngoài ra, các thuật toán còn hỗ trợ nén dữ liệu hình ảnh, tăng cường chất lượng hình ảnh, cũng như ước tính hình ảnh và quang phổ hình ảnh hiệu quả.
Các ngôn ngữ lập trình, khả năng đồ họa và xuất nhập dữ liệu
2.2.1 Khả năng của ngôn ngữ Java
Ngôn ngữ lập trình bậc cao như C, C++, Perl và SmallTalk có khả năng phát triển ứng dụng đa dạng, từ giải quyết các bài toán số học, xử lý văn bản cho đến việc tạo ra trò chơi và nhiều ứng dụng khác.
Có các môi trường lập trình đồ họa như Visual Java, Symantec Cafe, Jbuilder, Jcreator,…
Ngôn ngữ an toàn giúp đảm bảo rằng mọi thao tác truy xuất vào các thiết bị vào ra đều được thực hiện trên máy ảo, từ đó giảm thiểu rủi ro và nguy hiểm cho máy tính thật.
Con đường học tập ngôn ngữ lập trình Java rất ngắn gọn, vì Java dễ viết, biên dịch và gỡ lỗi hơn so với các ngôn ngữ lập trình phổ biến khác như C++, Objective-C và C.
Lập trình hướng đối tượng: Ở đây có một lợi thế thú vị khác khi sử dụng
Java cho phép phát triển các chương trình mô-đun và mã tái sử dụng, giúp hệ thống trở nên linh hoạt và có khả năng mở rộng.
Java cung cấp một bộ API phong phú, hỗ trợ nhiều hoạt động khác nhau như kết nối cơ sở dữ liệu, kết nối mạng, xử lý I/O, phân tích cú pháp XML và các tiện ích khác.
Công cụ mã nguồn mở mạnh mẽ phát triển nhanh chóng
Thư viện mã nguồn mở
Cộng đồng hỗ trợ Java là một trong những điểm mạnh của ngôn ngữ này, cung cấp cho các lập trình viên Java cơ hội học hỏi và phát triển kỹ năng lập trình Sự kết nối trong cộng đồng giúp các developer làm việc hiệu quả hơn và chia sẻ kiến thức về nghệ thuật lập trình.
Trình biên dịch Java chưa được tối ưu hóa tốt so với C ++.
Không có sự tách biệt đặc điểm kỹ thuật khi triển khai
Quản lý bộ nhớ, với Java, là khá tốn kém Thư viện mã nguồn mở
Việc thiếu các template có thể hạn chế khả năng của Java để tạo ra các cấu trúc dữ liệu chất lượng cao.
Người ta có thể tìm thấy một số lỗi trong trình duyệt và các chương trình ví dụ
2.3.1 Những đặc trưng của ngôn ngữ C#
Ngôn ngữ lập trình này là một ngôn ngữ thuần hướng đối tượng, dễ học với khoảng 80 từ khóa và hơn mười kiểu dữ liệu được định sẵn Nó cũng hỗ trợ thư viện mã nguồn mở, giúp người dùng dễ dàng phát triển ứng dụng.
Cung cấp những đặc tính hướng thành phần (component-oriented) như là Property, Event
C# không khuyến khích sử dụng con trỏ như trong C++ nhưng nếu bạn thực sự muốn sử dụng thì phải đánh dấu đây là mã không an toàn
C# có bộ Garbage Collector sẽ tự động thu gom vùng nhớ khi không còn sử dụng nữa.
C# đã loại bỏ đa kế thừa trong C++ mà thay vào đó C# sẽ hỗ trợ thực thi giao diện interface
Gần gũi với các ngôn ngữ lập trình thông dụng (C++, Java, Pascal).
Xây dựng dựa trên nền tảng của các ngôn ngữ lập trình mạnh nên thừa hưởng những ưu điểm của những ngôn ngữ đó.
Cải tiến các khuyết điểm của C/C++ như con trỏ, các hiệu ứng phụ,
Dễ tiếp cận, dễ phát triển.
Được sự chống lưng của NET Framework.
Nhược điểm lớn nhất của C# là chỉ chạy trên nền Windows và có cài NET Framework.
Thao tác đối với phần cứng yếu hơn so với ngôn ngữ khác Hầu hết phải dựa vào windows.
Là một ngôn ngữ lập trình mã nguồn mở đa mục đích, một loại ngôn ngữ bậc cao, thông dịch và hướng đối.
Python có cú pháp đơn giản, dễ hiểu và dễ học, đồng thời rất linh hoạt trong phát triển ứng dụng Ngôn ngữ này hỗ trợ nhiều mẫu lập trình, bao gồm lập trình hướng đối tượng, lập trình hàm, lập trình mệnh lệnh và phong cách lập trình theo thủ tục.
Là một ngôn ngữ có hình thức sáng sủa, cấu trúc roc ràng, cú pháp ngắn gọn
Có trên tất cả các nền tảng hệ điều hành từ UNIX, MS – DOS, Mac OS, Windows và Linix và các OS khác thuộc họ Unix.
Tương thích mạnh mẽ với Unix, hardware, thirt-party software với số lượng thư viện khổng lồ (400 triệu người sử dụng)
Python với tốc độ xử lý cực nhanh, python có thể tạo ra những chương trình từ những script siêu nhỏ tới những phần mềm cực lớn như Biender 3D.
Python không có các thuộc tính như: protected, private hay public, không có vòng lặp do…while và switch….case.
Mặc dù tốc độ xử lý của Python nhanh hơn PHP nhưng không bằng JAVA và C++.
2.5.1 Một số đặc trưng của ngôn ngữ C++:
C++ là ngôn ngữ lập trình bậc trung, cho phép phát triển cả ứng dụng bậc cao và chương trình bậc thấp, tối ưu cho việc hoạt động trên phần cứng.
C++ là một ngôn ngữ lập trình hướng đối tượng
C++ là một ngôn ngữ lập trình hướng cấu trúc giống ngôn ngữ C, nó có nghĩa là chúng ta có thể tổ chức chương trình trên khái niệm functions.
C++ có thể chạy trên nhiều nền tảng khác nhau như Windows, Mac OS, một số biến thể của UNIX…
C++ được thiết kế để viết những hệ thống lớn, thậm chí C++ được dùng để tạo nên hệ điều hành máy tính (Linux, Mac OS X, Windows…)
C++ là ngôn ngữ lập trình chủ yếu được sử dụng để phát triển các game lớn như World of Warcraft, series Diablo và StarCraft của Blizzard Hầu hết các game bom tấn hiện nay cũng được xây dựng trên nền tảng C++ Nhiều công cụ lập trình game nổi tiếng như Unreal Engine và Cocos2d-x framework cũng sử dụng C++ Các công ty hàng đầu trong ngành công nghiệp game như Valve và CryTek cũng chọn C++ làm ngôn ngữ chính cho phát triển sản phẩm của họ.
C++ có thể được sử dụng ở phía Web server vì C++ có thể đáp ứng được yêu cầu về tốc độ xử lý, khả năng phản hồi nhanh.
Mặc dù có nhiều ngôn ngữ lập trình khác như C# và Java có khả năng phát triển ứng dụng lớn cho máy tính, nhưng C++ vẫn được ưu tiên cho những ứng dụng yêu cầu tốc độ xử lý cao và tính thương mại lớn.
Kích thước của mảng trong lập trình phải được xác định trước khi chương trình chạy, vì vậy khi cấp phát mảng tĩnh, cần khai báo kích thước cụ thể Đặc biệt, các byte của vùng nhớ cấp phát cho mảng được sắp xếp liên tục, điều này có nghĩa là nếu vùng nhớ bị phân mảnh, chương trình có thể gặp lỗi khi cố gắng khai báo hoặc cấp phát mảng với kích thước lớn do không đủ vùng nhớ liên tục.
Dựa trên các đặc điểm của ngôn ngữ lập trình, cũng như ưu nhược điểm trong khả năng đồ họa và truy xuất dữ liệu, nhóm chúng tôi đã quyết định chọn ngôn ngữ Java để thực hiện lập trình.
2.6 Lựa chọn các ngôn ngữ trong các khâu tiếp theo
Dự vào kết quả so sánh trên chúng em đưa ra sự lựa chọn các ngôn ngữ lập trình phù hợp với các khâu như sau:
- Khâu xử lí hình ảnh: Chúng em lựa chọn ngôn ngữ lập trình C++.
- Khâu Thiết kế không gian hiện thị và mô phòng vật thể: Chúng em lựa chọn ngôn ngư lập trình Java.
Khâu xử lý hình ảnh
3.1 Tìm hiểu các khái niệm cơ bản trong xử lí ảnh số
3.1.1 Xử lí ảnh là gì
Con người thu nhận thông tin chủ yếu qua các giác quan, trong đó thị giác là quan trọng nhất Gần đây, sự phát triển nhanh chóng của phần cứng máy tính đã thúc đẩy mạnh mẽ lĩnh vực xử lý ảnh và đồ hoạ, với nhiều ứng dụng thiết thực trong cuộc sống Xử lý ảnh và đồ hoạ đóng vai trò then chốt trong tương tác giữa con người và máy móc Quá trình xử lý ảnh được hiểu là thao tác trên ảnh đầu vào để tạo ra kết quả mong muốn, và đầu ra của quá trình này có thể là một bức ảnh.
Ảnh có thể được định nghĩa là tập hợp các điểm ảnh, mỗi điểm ảnh thể hiện cường độ sáng hoặc một đặc trưng tại một vị trí cụ thể trong không gian Trong xử lý ảnh, ảnh có thể được coi như một hàm n biến P(c1, c2, , cn), do đó, ảnh được xem như một đối tượng n chiều.
Sơ đồ tổng quát của một hệ thống xử lý ảnh:
Hình 1Các bước cơ bản trong xử lí ảnh
3.1.2 Các khái niệm cơ bản trong xử lí ảnh: Ảnh số: Ảnh số là tập hợp hữu hạn các điểm ảnh với mức xám phù hợp dùng để mô tả ảnh gần với ảnh thật Số điểm ảnh xác định độ phân giải của ảnh Ảnh có độ phân giải càng cao thì càng thể hiện rõ nét các đặt điểm của tấm hình càng làm cho tấm ảnh trở nên thực và sắc nét hơn Thông tin về sách được sắp xếp theo thứ tự sau: tên tác giả, tên sách (chữ nghiêng), tên nhà xuất bản và năm xuất bản. Điểm ảnh: Điểm ảnh (Pixel) là một phần tử của ảnh số tại toạ độ (x, y) với độ xám hoặc màu nhất định Kích thước và khoảng cách giữa các điểm ảnh đó được chọn thích hợp sao cho mắt người cảm nhận sự liên tục về không gian và mức xám (hoặc màu) của ảnh số gần như ảnh thật Mỗi phần tử trong ma trận được gọi là một phần tử ảnh Độ phân giải của ảnh: Độ phân giải (Resolution) của ảnh là mật độ điểm ảnh được ấn định trên một ảnh số được hiển thị Theo định nghĩa, khoảng cách giữa các điểm ảnh phải được chọn sao cho mắt người vẫn thấy được sự liên tục của ảnh Việc lựa chọn khoảng cách thích hợp tạo nên một mật độ phân bổ, đó chính là độ phân giải và được phân bố theo trục x và y trong không gian hai chiều
Độ phân giải của màn hình CGA (Color Graphic Adaptor) là 320 điểm chiều dọc và 200 điểm chiều ngang (320*200) Khi so sánh giữa màn hình CGA 12” và 17”, màn hình 12” cho hình ảnh mịn hơn Nguyên nhân là do cùng một độ phân giải nhưng màn hình lớn hơn có diện tích rộng hơn, dẫn đến độ mịn của các điểm ảnh kém hơn.
Mức xám của ảnh được xác định bởi hai đặc trưng chính: vị trí (x, y) và độ xám của điểm ảnh Định nghĩa mức xám là cường độ sáng của điểm ảnh, được biểu thị bằng giá trị số tại vị trí đó Các khái niệm và thuật ngữ trong xử lý ảnh sẽ được xem xét để hiểu rõ hơn về mức xám.
Các thang giá trị mức xám thông thường bao gồm 16, 32, 64, 128 và 256, trong đó mức 256 là phổ biến nhất do được sử dụng 1 byte (8 bit) để biểu diễn, cho phép 256 mức xám từ 0 đến 255 Ảnh đen trắng chỉ có hai màu đen và trắng, với các mức xám khác nhau ở từng điểm ảnh Ảnh nhị phân, ngược lại, chỉ có hai mức đen và trắng, sử dụng 1 bit để mô tả 2 mức khác nhau, nghĩa là mỗi điểm ảnh chỉ có thể là 0 hoặc 1 Đối với ảnh màu, lý thuyết ba màu (Đỏ, Xanh lá, Xanh dương) thường sử dụng 3 byte để mô tả màu sắc, cho phép tạo ra khoảng 16,7 triệu màu.
3.2 Cài đặt thư viện OpenCV vào project Visual studio
Thư viện OpenCV (Open Computer Vision) là một trong những thư viện mã nguồn mở hàng đầu cho xử lý thị giác máy tính, machine learning và xử lý ảnh Được viết bằng C/C++, OpenCV có tốc độ tính toán nhanh, phù hợp cho các ứng dụng thời gian thực Thư viện này hỗ trợ nhiều ngôn ngữ lập trình như C/C++, Python và Java, cho phép hoạt động trên các hệ điều hành như Windows, Linux, macOS, Android và iOS Với hơn 47 nghìn thành viên trong cộng đồng và hơn 6 triệu lượt tải, phiên bản mới nhất hiện nay là OpenCV 4.0.0.
Visual Studio là một IDE (môi trường phát triển tích hợp) do Microsoft phát triển, hỗ trợ lập trình viên trong việc tạo ra các ứng dụng máy tính cho hệ điều hành Windows Ngoài ra, nó còn được sử dụng để phát triển các trang web, ứng dụng web và dịch vụ web, mang lại sự linh hoạt và hiệu quả trong quá trình phát triển phần mềm.
Visual Studio là một công cụ mạnh mẽ hỗ trợ nhiều ngôn ngữ lập trình khác nhau, bao gồm cả C, C++, C++/CLI, CSS, VB.NET và C# Ngoài ra, nó còn cho phép lập trình viên làm việc với các ngôn ngữ khác như Python, Ruby và HTML/XHTML, cung cấp trình biên tập mã và gỡ lỗi hiệu quả cho hầu hết các ngôn ngữ lập trình.
3.3 Lập trình xử lí ảnh số để phát hiện ra các vật hình tròn màu trắng và xác định tọa độ tâm
3.3.1 Tích hợp OpenCV 3.0 vào project:
Sau khi tải về thư viện OpenCV phiên bản 3.0, file cài đặt sẽ có tên là opencv-3.0.0.exe Tiến hành chạy file này và chọn đường dẫn để giải nén thư viện OpenCV Sau khi quá trình giải nén hoàn tất, bạn sẽ thu được hai thư mục.
Build: chứa thư viện OpenCV đã được biên dịch thành thư viện cho nhiều ngôn ngữ khác nhau: C++, Java, Python
Sources: tài liệu hướng dẫn, ví dụ và mã nguồn của OpenCV
Hình 2 Thư viện OpenCV 3.0 sau khi giải nén
Khởi tạo một project C++ trống và đặt tên là TTKT20181
Hình 3 Khởi tạo Project mới với Visual Studio
Tại giao diện của Visual Studio, chọn Project Properties > ConfigurationProperties > C/C++ > General > Addition Include Directories, ta thêm đường dẫnD:\phan mem\Thư viện xử lý ảnh\opencv\build\include.
Hình 4 Tích hợp OpenCV vào Project (1)
Tiếp theo, cũng tại trang Project Properties, chọn Linker > General > Addition Library Directories, thêm vào đường dẫn D:\phan mem\Thư viện xử lý ảnh\opencv\build\x64\vc12\lib
Hình 5 Tích hợp OpenCV vào Project (2)
Và tại Linker => Input, ta thêm vào các thư viện sau: opencv_ts300d.lib,opencv_world300d.lib.
Hình 6 Tích hợp OpenCV vào Project (3)
Copy opencv_world300d.dll trong Lib\opencv\bin vàofolder Debug của project Tới đây, ta đã kết thúc việc tích hợp thư viện OpenCV vào project.
3.3.2 Viết chương trình nhận dạng vật hình tròn, màu trắng và xác định vị trí tâm của vật trong ảnh số:
Đọc và hiển thị một hình ảnh:
Trong thư viện OpenCV cung cấp cấu trúc cũng cấp hình ảnh Mat trong modules Core Cấu trúc [5] Khai báo:
Mat src; src = imread("that1.jpg");
Hàm imread("that1.jpg") là hàm dùng để đọc hình ảnh truyền vào từ một file với đối số truyền vào là tên hìn hảnh được chọn.
Để phục vụ cho quá trình nhận dạng, chúng ta chuyển đổi hệ màu RGB của ảnh gốc sang hệ màu HSV bằng cách sử dụng hàm cvtColor: cvtColor(src, hsv_image, CV_RGB2HSV).
src: hình ảnh RGB đầu vào.
hsv_image: hình ảnh đầu ra có cùng size với đầu vào.
CV_RGB2HSV: code quy định chuyển hệ màu từ RGB sang HSV
Sau khi chuyển đổi từ hệ màu RGB sang hệ màu HSV, ta tiến hành lọc màu ảnh (filter color) bằng cách sử dụng hàm InRange [6] : inRange (hsv_image,
Scalar (0, 0, 164), Scalar (48, 0, 255), imgThreshold1); inRange (hsv_image,
Scalar (140, 0, 164), Scalar (180, 0, 255), imgThreshold2); imgThreshold = max (imgThreshold1, imgThreshold2);
To track specific colored objects, such as white regions, we utilize the findContours function to identify and outline the boundaries of these areas The function is implemented as follows: findContours(imgThreshold, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)) To determine the centroid of the enclosed white regions, we apply the moments function, which is executed in a loop for each contour in the contours vector.
} vector mc(contours.size()); for (int i = 0; i < contours.size(); i++)
{ mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00); cout