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.
MỤC LỤCKHOA HÀ NỘI TRƯỜNG ĐẠI HỌC BÁCH MỤC LỤC VIỆN ĐIỆN TỬ - VIỄN THƠNG DANH MỤC HÌNH ẢNH .2 A ĐẶT VẤN ĐỀ Tính cấp thiết Mục tiêu đề tài .3 B NỘI DUNG Cơ sở lí thuyết 2.1 Giới thiệu nhận dạng xử lý hình ảnh Các ngơn ngữ lập trình, khả đồ họa xuất nhập liệu 2.2 Ngôn ngữ Java .6 2.3 Ngôn ngữ C# 2.4 Ngôn ngữ Python 2.5 Ngôn ngữ C++ 2.6 Lựa chọn ngôn ngữ khâu Khâu xử lý hình ảnh 3.1 Tìm hiểu khái niệm xử lí ảnh số 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 vật hình trịn màu trắng xác định tọa độ tâm .11 ĐỒ ÁN II Đề tài: Thiết kế phần mềm mô Khâu thiết kế không gian hiển thị, mô vật thể không gian 15 4.1 Truy xuất liệu với Apache POI .15 chuyển động khung xương 4.2 Hiển thị đồ họa 3D Java sử dụng thư viện JOGL 23 4.3 Xuất ứng dụng Java .26 Kết 33 5.1 Kết hiển thị 33 5.2 Kết so mục tiêu đề .36 Giảng viên hướng dẫn : TS Đào Việt Hùng C KẾT LUẬN 37 D TÀI LIỆU THAM KHẢO 38 PHỤ LỤC 39 HÀ NỘI - 2019 DANH MỤC HÌNH ẢNH Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình 1Các bước xử lí ảnh Thư viện OpenCV 3.0 sau giải nén .11 Khởi tạo Project với Visual Studio 11 Tích hợp OpenCV vào Project (1) 12 Tích hợp OpenCV vào Project (2) 12 Tích hợp OpenCV vào Project (3) 13 Các tiếp đầu ngữ Apache POI 15 Các đối tượng Apache POI Excel 16 Chọn main class project 25 10 Clean and build file jar 26 11 Hoàn thành tạo file jar 26 12 Kiểm tra việc chạy file jar .27 13 Mở giao diện phần mềm lauch4j .28 14 Đặt tên cho file exe 29 15 Thêm file jar 30 16 Thêm icon cho file exe 30 17 Tạo file exe .31 18 Chạy thử file exe .32 19 Chọn vị trí lưu file 32 20 Kết thực chương trình 33 21 Kết truy xuất liệu từ file Excel 34 22 Kết hiển thị đồ họa 3D .34 23 Giao diện ứng dụng 35 A ĐẶT VẤN ĐỀ Tính cấp thiết Xương phận rắn bên tạo thành khung vững nâng đỡ toàn thể, làm hỗ trợ cho thành phần khác thể Xương có nhiệm vụ chủ yếu: nâng đỡ, bảo vệ vận động Ngoài ra, xương kho dự trữ chất khoáng (Canxi Photpho); tủy xương nơi tạo huyết sản sinh 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 việc nặng gây áp lực lên khớp xương…tạo nên nguy gây thương tổn cho thể Thương tổn ảnh hưởng trực tiếp lên xương, bắp, sụn khớp mô liên kết day chằng Hầu hết thương tổn có hình thành từ trước dự phịng tái phát, nên không cần thiết phải ngưng hẳn hoạt động thể thao hay bắp thời gian dài Tuy nhiên, không nhận thức đắn mức độ thương tổn xem nhẹ tình hình lâu ngày dẫn đến mãn tính trở nên khó chữa trị Những chấn thương xương khớp 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 để phát tổn thương hệ xương sử dụng máy chụp X- Quang Tuy nhiên, phương pháp sử dụng tia X gây hại cho bệnh nhân, mà tia X loại tia có hại cho thể Dù ngày có nhiều phương pháp để giảm tác động tia X, tác động tia X tới thể điều tránh khỏi sử dụng chẩn đốn Chính thế, chúng em nghiên cứu để đưa hệ thống mô xương người sử dụng Camera Mục tiêu đề tài Đề tài chúng em thực lần mục đích tìm hiểu thiết kế phần mềm mô chuyển động mẫu vật 3D đơn giản lấy liệu từ file excel Dữ liệu file Excel kết qảu khâu xử lí hình ảnh từ việc nhận dạng vẽ tọa độ vật thể không gian từ việc đặt camera quay vật thể Thiết kế phần mềm ngôn ngữ lấp trình thơng dụng dễ tìm hiểu, dễ xử lí B NỘI DUNG Sau xác định đề tài chúng em tiến hành theo thự tự bước Khâu 1: Tìm hiểu sở lí thuyết nhận dạnh xử lí hình ảnh Trong khâu chúng em rút cách nhận giạng hình ảnh qua áp dúng vào đề tài Khâu 2: Tìm hiểu ngơn ngữ lập trình Trong khâu chúng em tìm hiểu ngơn ngữ lập trình liên quan dễ áp dụng cho đề tài khâu Khâu 3: Khâu xử lí hình ảnh Áp dụng ngơn ngữ lập trình, thuật tốn hàm để nhận diên hình ảnh qua tạo toạn độ điểm vật thể không gian bọn em tạo sẵn Khâu 4: Khẩu thiết kế không gian, thỉ vật thể lên khơng gian mơ phịng chuyển độngc ảu vật không gian Dùng ngôn ngữ lập trinh tạo hàm tạo trường không gian truy xuất liệu từ file Excel data (kết toạn độ từ khâu 3) Đưa liệu lên khơng gian 3D hiển thị mơ chuyển động vật) Cơ sở lí thuyết 2.1 Giới thiệu nhận dạng xử lý hình ảnh 2.1.1 Tìm hiểu cơng nghệ xử lý hình ảnh Cơng nghệ nhận dạng hình ảnh có tiềm lớn việc áp dụng rộng rãi ngành công nghiệp khác Các công ty lớn Tesla, Google, Uber, Adobe Systems vv sử dụng công nghệ nhận dạng hình ảnh Để chứng minh cơng nghệ tồn khắp giới, xem xét số liệu thống kê gần Các nhà nghiên cứu dự đốn thị trường tồn cầu cơng nhận dạng hình ảnh đạt 38,92 tỷ USD vào năm 2021 Đó số lớn! Vì vậy, khơng có thắc mắc ngày nhiều gọi ứng dụng imagetech tận dụng nhận dạng hình ảnh cho mục đích khác kinh doanh Điều giúp mở rộng cơng nghệ nhận dạng hình ảnh ngày nay? Đó cơng cụ mã nguồn mở giúp lập trình dễ dàng hơn, tính tốn giá phải Các khung công tác thư viện nguồn mở ngày làm cho cơng ty hưởng lợi từ cơng nghệ nhận dạng hình ảnh theo cấp số nhân Ví dụ, sở liệu mở lớn Pascal VOC ImageNet cung cấp quyền truy cập vào hàng triệu hình ảnh gắn thẻ Trên thực tế, họ giúp cơng ty cơng nghệ hình ảnh phát triển cải tiến ứng dụng thuật toán học máy (Machine learning) riêng họ Đối với nhà phát triển chuyên nghiệp nhận dạng hình ảnh thời gian thực sử dụng thư viện đa tảng nguồn mở gọi OpenCV Đây xem điểm giải nguồn tài nguyên có thẩm quyền cho chuyên gia nhận dạng hình ảnh Một thư viện tuyệt vời khác cho tầm nhìn máy tính bao gồm OpenNN, VXL nhiều loại khác Nhưng trước sâu vào chi tiết nhận dạng hình ảnh cách xử lý nó, nên hiểu hình ảnh sử dụng theo cách khác Trong hình ảnh phát triển phần mềm di động, web phần mềm phục vụ cho vô số lý do, bao gồm: Nhận dạng đối tượng Nhận dạng mẫu Định vị (chính xác 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 …v…v Tính ứng dụng khơng giới hạn Với tiến công nghệ mở nhiều hội cho doanh nghiệp Do đó, phân tích hình ảnh đưa đến cấp độ hồn tồn nhờ vào giải pháp nguồn mở cơng cụ học sâu (deep learning) 2.1.2 Nhận dạng hình ảnh Nhận dạng hình ảnh tầm nhìn máy tính kỹ thuật đề cập đến việc tìm kiếm cách để tự động hóa tất cơng việc mà hệ thống thị giác người làm TensorFlow Google, DeepFace Facebook, Dự án Oxford Microsoft ví dụ tuyệt vời hệ thống nhận dạng hình ảnh học sâu Mặt khác, API lưu trữ Google Cloud Vision, Clarifai, Imagga cho phép doanh nghiệp tiết kiệm số tiền lớn cho nhóm phát triển Ưu điểm dịch vụ mã nguồn mở đề cập nhiều Họ tiến hành tính tốn nhận dạng hình ảnh đám mây khiến cho hoạt động kinh doanh bạn trở nên hiệu rẻ nhiều Ngoài ra, nhà phát triển nội cơng ty bạn tích hợp API họ vào ứng dụng bạn mà không gặp cố Hơn nữa, nhà phát triển API mở sử dụng để phát triển doanh nghiệp lĩnh vực nhận dạng hình ảnh Có nhiều cách để nhận diện hình ảnh sử dụng X-quang, sử dụng sóng siêu âm, sử dụng tia hồng ngoại, sử dụng camera, Ở đề án lần này, chúng em sử dụng Camera việc nhận diện hình ảnh 2.1.3 Kỹ thuật xử lý hình ảnh Nói chung, xử lý ảnh bao gồm nhiều giai đoạn: nhập ảnh, phân tích, thao tác tạo ảnh Có hai phương pháp xử lý hình ảnh: kỹ thuật số (Digital) analog Đặc biệt, xử lý hình ảnh kỹ thuật số kỹ thuật viết đề cập đến Thuật tốn máy tính đóng vai trị quan trọng xử lý hình ảnh kỹ thuật số Nhà phát triển sử dụng nhiều thuật toán để giải tác vụ khác nhau, bao gồm phát hình ảnh kỹ thuật số, phân tích, xây dựng lại, khơi phục, nén liệu hình ảnh, tăng cường hình ảnh, ước tính hình ảnh ước tính quang phổ hình ảnh Các ngơn ngữ lập trình, khả đồ họa xuất nhập liệu 2.2 Ngôn ngữ Java 2.2.1 Khả ngôn ngữ Java Là ngôn ngữ bậc cao C, C++, Perl, SmallTalk, dùng để tạo ứng dụng để giải vấn đề số, xử lý văn bản, tạo trị chơi, nhiều thứ khác Có mơi trường lập trình đồ họa Visual Java, Symantec Cafe, Jbuilder, Jcreator,… Ngơn ngữ an tồn, tất thao tác truy xuất vào thiết bị vào thực máy ảo nhờ hạn chế thao tác nguy hiểm cho máy tính thật 2.2.2 Điểm mạnh Java Con đường học tập: Con đường học tập ngơn ngữ lập trình Java ngắn Java dễ viết, dễ biên dịch gỡ lỗi ngơn ngữ lập trình khác C ++, Objective-C, C Lập trình hướng đối tượng: Ở có lợi thú vị khác sử dụng Java Đó Java cho phép bạn tạo chương trình mơ-đun mã tái sử dụng để giữ cho hệ thống mở rộng linh hoạt API phong phú: Java cung cấp API cho hoạt động khác kết nối sở liệu, kết nối mạng, I / O, phân tích cú pháp XML, tiện ích Cơng cụ mã nguồn mở mạnh mẽ phát triển nhanh chóng Thư viện mã nguồn mở Hỗ trợ cộng đồng: Cuối cùng, có cộng đồng hỗ trợ Java lớn mà ngôn ngữ tập hợp Cọng đồng giúp đồng nhành Java developer để học nghệ thuật lập trình để làm việc hiệu 2.2.3 Nhược điểm Trình biên dịch Java chưa tối ưu hóa tốt so với C ++ Khơng có tách biệt đặc điểm kỹ thuật triển khai Quản lý nhớ, với Java, tốn Thư viện mã nguồn mở Việc thiếu template hạn chế khả Java để tạo cấu trúc liệu chất lượng cao Người ta tìm thấy số lỗi trình duyệt chương trình ví dụ 2.3 Ngơn ngữ C# 2.3.1 Những đặc trưng ngôn ngữ C# Là ngôn ngữ hướng đối tượng Là ngôn ngữ đơn giản, có khoảng 80 từ khóa mười kiểu liệu dựng sẵn Thư viện mã nguồn mở Cung cấp đặc tính hướng thành phần (component-oriented) Property, Event C# khơng khuyến khích sử dụng trỏ C++ bạn thực muốn sử dụng phải đánh dấu mã khơng an tồn (unsafe) C# có Garbage Collector tự động thu gom vùng nhớ khơng cịn sử dụng C# loại bỏ đa kế thừa C++ mà thay vào C# hỗ trợ thực thi giao diện interface 2.3.2 Ưu điểm Gần gũi với ngơn ngữ lập trình thông dụng (C++, Java, Pascal) Xây dựng dựa tảng ngơn ngữ lập trình mạnh nên thừa hưởng ưu điểm ngơn ngữ Cải tiến khuyết điểm C/C++ trỏ, hiệu ứng phụ, Dễ tiếp cận, dễ phát triển Được chống lưng NET Framework 2.3.3 Nhược điểm Nhược điểm lớn C# chạy Windows có cài NET Framework Thao tác phần cứng yếu so với ngôn ngữ khác Hầu hết phải dựa vào windows 2.4 Ngôn ngữ Python Là ngơn ngữ lập trình mã nguồn mở đa mục đích, loại ngôn ngữ bậc cao, thông dịch hướng đối Cú pháp python dễ, dễ hiểu, dễ học việc phát triển ứng dụng ngơn ngữ linh hoạt Python hỗ trợ mẫu đa lập trình, bao gồm lập trình hướng đối tượng, lập trình hàm mệnh lệnh phong cách lập trình theo thủ tục 2.4.1 Ưu điểm: Là 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ó tất tảng hệ điều hành từ UNIX, MS – DOS, Mac OS, Windows Linix 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 tạo chương trình từ script siêu nhỏ tới phần mềm cực lớn Biender 3D 2.4.2 Nhược điểm: Python khơng có thuộc tính như: protected, private hay public, khơng có vịng lặp do…while switch….case Mặc dù tốc độ xử lý Python nhanh PHP không JAVA C++ 2.5 Ngôn ngữ C++ 2.5.1 Một số đặc trưng ngôn ngữ C++: C++ ngôn ngữ lập trinh bậc trung Nó có nghĩa bạn sử dụng C++ để phát triển ứng dụng bậc cao, chương trình bậc thấp hoạt động tốt phần cứng C++ ngôn ngữ lập trình hướng đối tượng C++ ngơn ngữ lập trình hướng cấu trúc giống ngơn ngữ C, có nghĩa tổ chức chương trình khái niệm functions C++ chạy nhiều tảng khác Windows, Mac OS, số biến thể UNIX… 2.5.2 Ưu điểm C++ thiết kế để viết hệ thống lớn, chí C++ dùng để tạo nên hệ điều hành máy tính (Linux, Mac OS X, Windows…) C++ dùng để tạo nên game lớn hãng Blizzard (World of Warcraft, Diablo series, StarCraft series…) Gần toàn game bom thị trường dùng C++ để phát triển Một số công cụ sử dụng việc lập trình game có sử dụng C++ Unreal engine, Cocos2d-x framework, Các ông lớn ngành công nghiệp game Valve, CryTek sử dụng C++ C++ sử dụng phía Web server C++ đáp ứng yêu cầu tốc độ xử lý, khả phản hồi nhanh Tuy bên cạnh C++ cịn có ngơn ngữ lập trình khác C#, Java, … làm ứng dụng lớn cho máy tính, ứng dụng có u cầu mặt tốc độ xử lý, có tính thương mại cao, người ta ưu tiên C++ 2.5.3 Nhược điểm: Kích thước mảng phải cố định: Trong cấp phát mảng tĩnh, mảng cần khai báo với kích thước xác định trước chạy chương trình Các byte vùng nhớ cấp phát mảng xếp liên tục: trường hợp vùng nhớ cho chương trình bị phân mảnh, chương trình báo lỗi khai báo cấp phát cho mảng với kích thước lớn khơng đủ vùng nhớ liên tục cho mảng… Kết luận: Dựa đặc điểm ngơn ngữ lập trình, ưu nhược điểm khả đồ họa truy xuất liệu, nhóm chúng em định sử dụng ngôn ngữ Java để lập trình 2.6 Lựa chọn ngơn ngữ khâu Dự vào kết so sánh chúng em đưa lựa chọn ngôn ngữ lập trình phù hợp với khâu 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 thị 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 khái niệm xử lí ảnh số 3.1.1 Xử lí ảnh Con người thu nhận thông tin qua giác quan, thị giác đóng vai trị quan trọng Những năm trở lại với phát triển phần cứng máy tính, xử lý ảnh đồ hoạ phát triển cách mạnh mẽ có nhiều ứng dụng sống Xử lý ảnh đồ hoạ đóng vai trị quan trọng tương tác người máy Quá trình xử lý ảnh xem trình thao tác ảnh đầu vào nhằm cho kết mong muốn Kết đầu q trình xử lý ảnh ảnh “tốt hơn” kết luận Ảnh xem tập hợp điểm ảnh điểm ảnh xem đặc trưng cường độ sáng hay dấu hiệu vị trí đối tượng khơng gian xem hàm n biến P(c1, c2, , cn) Do đó, ảnh xử lý ảnh xem ảnh n chiều [3] Sơ đồ tổng quát hệ thống xử lý ảnh: Hình 1Các bước xử lí ảnh 3.1.2 Các khái niệm xử lí ảnh: Ảnh số: Ảnh số tập hợp hữu hạn đ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 ảnh Ảnh có độ phân giải cao thể rõ nét đặt điểm hình làm cho ảnh trở nên thực sắc nét Thông tin sách xếp theo thứ tự sau: tên tác giả, tên sách (chữ nghiêng), tên nhà xuất năm xuất Điểm ảnh: Điểm ảnh (Pixel) phần tử ảnh số toạ độ (x, y) với độ xám màu định Kích thước khoảng cách điểm ảnh chọn thích hợp cho mắt người cảm nhận liên tục không gian mức xám (hoặc màu) ảnh số gần ảnh thật Mỗi phần tử ma trận gọi phần tử ảnh Độ phân giải ảnh: Độ phân giải (Resolution) ảnh mật độ điểm ảnh ấn định ảnh số hiển thị Theo định nghĩa, khoảng cách điểm ảnh phải chọn cho mắt người thấy liên tục ảnh Việc lựa chọn khoảng cách thích hợp tạo nên mật độ phân bổ, độ phân giải phân bố theo trục x y không gian hai chiều Ví dụ: Độ phân giải ảnh hình CGA (Color Graphic Adaptor) lưới điểm theo chiều ngang hình: 320 điểm chiều dọc * 200 điểm ảnh (320*200) Rõ ràng, hình CGA 12” ta nhận thấy mịn hình CGA 17” độ phân giải 320*200 Lý do: mật độ (độ phân giải) diện tích hình rộng độ mịn (liên tục điểm) Mức xám ảnh: Một điểm ảnh (pixel) có hai đặc trưng vị trí (x, y) điểm ảnh độ xám Dưới xem xét số khái niệm thuật ngữ thường dùng xử lý ảnh Định nghĩa: Mức xám điểm ảnh cường độ sáng gán giá trị số điểm Các thang giá trị mức xám thông thường: 16, 32, 64, 128, 256 (Mức 256 mức phổ dụng Lý do: từ kỹ thuật máy tính dùng 1byte (8bit) để biểu diễn mức xám: Mức xám dùng 1byte biểu diễn: 28 =256 mức, tức từ đến 255) Ảnh đen trắng: ảnh có hai màu đen, trắng (khơng chứa màu khác) với mức xám điểm ảnh khác D TÀI LIỆU THAM KHẢO Đọc Ghi file excel Java sử dụng Apache POI [1]https://o7planning.org/vi/11259/doc-ghi-file-excel-trong-java-su-dung-apachepoi Java 3D [2] https://www.slideshare.net/huyna88/java-3d [3]https://tailieu.vn/doc/gioi-thieu-va-tong-quan-thu-vien-opengl-va-glut1263687.html [4]https://text.123doc.org/document/1568453-gioi-thieu-va-tong-quan-thu-vienopengl-va-glut-doc.htm [5]https://designervn.net/threads/tim-hiu-cong-ngh-nhn-dang-hinh-anh-va-x-lyhinh-anh.6628/ [6]http://itplus-academy.edu.vn/Uu-va-nhuoc-diem-cua-Python-trong-lap-trinh.html [7]http://niithanoi.vn/chi-tiet-tin/1729/7-diem-manh-5-diem-yeu-cua-ngon-ngu-laptrinh-java.html#.XD6U61wzbIV [8]https://daynhauhoc.com/t/loi-arrayindexoutofboundsexception-khi-hien-thucinsertion-sort/2394/5 [9]www.oracle.com/technetwork/java/index.htmlhttp:// [10]www.java3d.org/samples.htmlhttps:// [11]www.google.com/search?q=h%C3%A0m+GL_POINT+trong+JOGL&oq=h %C3%A0m+GL_POINT+trong+JOGL&aqs=chrome 69i57.18240j0j7&sourceid=c hrome&ie=UTF-8 [12] https://open.gl/transformations [13] https://community.khronos.org/t/opengl-rotation-function/70020 [14] https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glRotate.xml 38 PHỤ LỤC Code truy xuất liệu excel /* * To change this license header, choose License Headers in Project Properties * To change this template file, choose Tools | Templates * and open the template in the editor */ package project1; import import import import import import import import import import import java.io.File; java.io.FileInputStream; java.io.FileNotFoundException; java.io.IOException; java.util.ArrayList; java.util.Iterator; org.apache.poi.ss.usermodel.Cell; org.apache.poi.ss.usermodel.Row; org.apache.poi.ss.usermodel.Sheet; org.apache.poi.ss.usermodel.Workbook; org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * * @author Nick */ public class ImportExcel { /** * */ public static ArrayList ArrayX = new ArrayList(); private static final String FILE_NAME = "Demo.xlsx"; public static double a[] = {0.0d, 0.0d, 0.0d, 0.0d, 1.0d, 1.0d, 1.0d, 1.0d}; public static double b[] = {0.0d, 0.0d, 1.0d, 1.0d, 0.0d, 0.0d, 1.0d, 1.0d}; public static double c[] = {0.0d, 1.0d, 0.0d, 1.0d, 0.0d, 1.0d, 0.0d, 1.0d}; 39 //main public static void main(String[] args) { ArrayX.clear(); try { FileInputStream excelFile = new FileInputStream(new File(FILE_NAME)); Workbook workbook = new XSSFWorkbook(excelFile); Sheet datatypeSheet = workbook.getSheetAt(0); Iterator iterator = datatypeSheet.iterator(); while (iterator.hasNext()) { Row currentRow = iterator.next(); Iterator cellIterator = currentRow.iterator(); while (cellIterator.hasNext()) { Cell currentCell = cellIterator.next(); ArrayX.add(currentCell.getNumericCellValue()); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(ArrayX); for (int i = 0; i < 24; i++) { if (i % == 0) { a[i / 3] = ArrayX.get(i); } else if (i % == 1) { b[(i - 1) / 3] = ArrayX.get(i); } else { c[(i - 2) / 3] = ArrayX.get(i); } } for (int i = 0; i < 8; i++) { System.out.println("Tọa độ điểm thứ " + (i + 1) + " là:" + "(" + a[i] + "," + b[i] + "," + c[i] + ")"); } 40 } } Code hiển thị 3D /* * To change this license header, choose License Headers in Project Properties * To change this template file, choose Tools | Templates * and open the template in the editor */ package project1; import import import import import import import import import import import com.jogamp.opengl.GL; static com.jogamp.opengl.GL.GL_LINES; com.jogamp.opengl.GL2; com.jogamp.opengl.GLAutoDrawable; com.jogamp.opengl.GLCapabilities; com.jogamp.opengl.GLEventListener; com.jogamp.opengl.GLProfile; com.jogamp.opengl.awt.GLCanvas; com.jogamp.opengl.glu.GLU; javax.swing.JFrame; com.jogamp.opengl.util.FPSAnimator; public class Cube extends JFrame implements GLEventListener { /** * */ public static double a[] = {0.0d, 0.0d, 0.0d, 0.0d, 1.0d, 1.0d, 1.0d, 1.0d}; public static double b[] = {0.0d, 0.0d, 1.0d, 1.0d, 0.0d, 0.0d, 1.0d, 1.0d}; public static double c[] = {0.0d, 1.0d, 0.0d, 1.0d, 0.0d, 1.0d, 0.0d, 1.0d}; //main public static void main(String[] args) { //opengl final GLProfile profile = GLProfile.get(GLProfile.GL2); 41 GLCapabilities capabilities = new GLCapabilities(profile); // The canvas final GLCanvas glcanvas = new GLCanvas(capabilities); projectI cube = new projectI(); glcanvas.addGLEventListener(cube); glcanvas.setSize(800, 800); final JFrame frame = new JFrame(" Multicolored cube"); frame.getContentPane().add(glcanvas); frame.setSize(frame.getContentPane().getPreferredSize()); frame.setVisible(true); final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true); } animator.start(); //other private GLU glu = new GLU(); private float rotation = 0.0f; @Override public void display(GLAutoDrawable drawable) { final GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(-2.0f, 0.0f, -6.0f); gl.glRotatef(0, 1.0f, 1.0f, 1.0f); //Oxyz //Ox red gl.glBegin(gl.GL_LINES); gl.glColor3d(1.0, 0.0, 0.0); gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(10.0, 0.0, 0.0); gl.glEnd(); //OY yellow gl.glBegin(GL_LINES); gl.glColor3d(1.0, 1.0, 0.0); 42 gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(0.0, 10.0, 0.0); gl.glEnd(); //OZ blue gl.glBegin(GL_LINES); gl.glColor3d(0.0, 0.0, 1.0); gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(0.0, 0.0, 10.0); gl.glEnd(); //cube // create solid cube gl.glTranslated(0.0, 0.0, 0.0); gl.glRotatef(rotation, 1.0f, 1.0f, 0.0f); gl.glScaled(0.5, 0.5, 0.5); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(0.0f, 0.0f, 0.1f); gl.glVertex3d(a[0], b[0], c[0]); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[3], b[3], c[3]); gl.glVertex3d(a[2], b[2], c[2]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(0.0f, 1f, 0.0f); gl.glVertex3d(a[0], b[0], c[0]); gl.glVertex3d(a[2], b[2], c[2]); gl.glVertex3d(a[6], b[6], c[6]); gl.glVertex3d(a[4], b[4], c[4]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1.0f, 0f, 0f); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[3], b[3], c[3]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[5], b[5], c[5]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1f, 1f, 0f); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[5], b[5], c[5]); gl.glVertex3d(a[4], b[4], c[4]); gl.glVertex3d(a[0], b[0], c[0]); gl.glEnd(); 43 gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1f, 0f, 1f); gl.glVertex3d(a[4], b[4], c[4]); gl.glVertex3d(a[5], b[5], c[5]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[6], b[6], c[6]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1, 1.0, 1.0f); gl.glVertex3d(a[2], b[2], c[2]); gl.glVertex3d(a[6], b[6], c[6]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[3], b[3], c[3]); gl.glEnd(); gl.glFlush(); rotation += 0.6f; } @Override public void dispose(GLAutoDrawable drawable) { } @Override public void init(GLAutoDrawable drawable) { final GL2 gl = drawable.getGL().getGL2(); gl.glEnable(GL.GL_DEPTH_TEST); // bật chức cho phép loại bỏ phần đối tượng bị che đối tượng khác } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { final GL2 gl = drawable.getGL().getGL2(); if (height { arrayX.clear(); try { getData(); } catch (IOException ex) { Logger.getLogger(JavaFXApplication4.class.getName()).log(Level.S EVERE, null, ex); } 46 }); //JavaFx Animation playButton.setOnAction(e -> { play(); System.out.println(e.toString()); }); HBox layout = new HBox(20); layout.getChildren().addAll(getDataButton,playButton); layout.setAlignment(Pos.CENTER); scene = new Scene(layout, 300, 250); stage.setTitle("Demo"); stage.setScene(scene); stage.show(); } public void play(){ //opengl final GLProfile profile = GLProfile.get(GLProfile.GL2); GLCapabilities capabilities = new GLCapabilities(profile); // The canvas final GLCanvas glcanvas = new GLCanvas(capabilities); JavaFXApplication4 app = new JavaFXApplication4(); glcanvas.addGLEventListener(app); glcanvas.setSize(800, 800); final JFrame frame = new JFrame(" Multicolored cube"); frame.getContentPane().add(glcanvas); frame.setSize(frame.getContentPane().getPreferredSize()); frame.setVisible(true); final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true); animator.start(); } public void getData() throws FileNotFoundException, IOException{ try { 47 FileInputStream excelFile = new FileInputStream(new File(FILE_NAME)); Workbook workbook = (Workbook) new XSSFWorkbook(excelFile); Sheet datatypeSheet = workbook.getSheetAt(0); Iterator iterator = datatypeSheet.iterator(); while (iterator.hasNext()) { Row currentRow = iterator.next(); Iterator cellIterator = currentRow.iterator(); while (cellIterator.hasNext()) { Cell currentCell = cellIterator.next(); ArrayX.add(currentCell.getNumericCellValue()); //getCellTypeEnum shown as deprecated for version 3.15 //getCellTypeEnum ill be renamed to getCellType starting from version 4.0 // if (currentCell.getCellTypeEnum() == CellType.STRING) { // System.out.print(currentCell.getStringCellValue() + "++"); // } else if (currentCell.getCellTypeEnum() == CellType.NUMERIC) { // // System.out.println(currentCell.getNumericCellValue()); // } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println(ArrayX); for (int i = 0; i < 24; i++) { switch (i % 3) { case 0: a[(i-1)/ 3] = ArrayX.get(i); break; 48 case 1: b[(i - 1) / 3] = ArrayX.get(i); break; default: c[(i - 2) / 3] = ArrayX.get(i); break; } } for (int i = 0; i < 8; i++) { System.out.println("Tọa độ điểm thứ " + (i + 1) + " là:" + "(" + a[i] + "," + b[i] + "," + c[i] + ")"); } } @Override public void display(GLAutoDrawable drawable) { final GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); gl.glLoadIdentity(); gl.glTranslatef(-2.0f, 0.0f, -6.0f); gl.glRotatef(0, 1.0f, 1.0f, 1.0f); //Oxyz //Ox red gl.glBegin(gl.GL_LINES); gl.glColor3d(1.0, 0.0, 0.0); gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(10.0, 0.0, 0.0); gl.glEnd(); //OY yellow gl.glBegin(GL_LINES); gl.glColor3d(1.0, 1.0, 0.0); gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(0.0, 10.0, 0.0); gl.glEnd(); //OZ blue gl.glBegin(GL_LINES); gl.glColor3d(0.0, 0.0, 1.0); gl.glVertex3d(0.0, 0.0, 0.0); gl.glVertex3d(0.0, 0.0, 10.0); 49 gl.glEnd(); //cube // create solid cube gl.glTranslated(0.0, 0.0, 0.0); gl.glRotatef(rotation, 1.0f, 1.0f, 0.0f); gl.glScaled(0.5, 0.5, 0.5); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(0.0f, 0.0f, 0.1f); gl.glVertex3d(a[0], b[0], c[0]); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[3], b[3], c[3]); gl.glVertex3d(a[2], b[2], c[2]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(0.0f, 1f, 0.0f); gl.glVertex3d(a[0], b[0], c[0]); gl.glVertex3d(a[2], b[2], c[2]); gl.glVertex3d(a[6], b[6], c[6]); gl.glVertex3d(a[4], b[4], c[4]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1.0f, 0f, 0f); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[3], b[3], c[3]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[5], b[5], c[5]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1f, 1f, 0f); gl.glVertex3d(a[1], b[1], c[1]); gl.glVertex3d(a[5], b[5], c[5]); gl.glVertex3d(a[4], b[4], c[4]); gl.glVertex3d(a[0], b[0], c[0]); gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1f, 0f, 1f); gl.glVertex3d(a[4], b[4], c[4]); gl.glVertex3d(a[5], b[5], c[5]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[6], b[6], c[6]); 50 gl.glEnd(); gl.glBegin(gl.GL_POLYGON); gl.glColor3d(1, 1.0, 1.0f); gl.glVertex3d(a[2], b[2], c[2]); gl.glVertex3d(a[6], b[6], c[6]); gl.glVertex3d(a[7], b[7], c[7]); gl.glVertex3d(a[3], b[3], c[3]); gl.glEnd(); gl.glFlush(); } rotation += 0.6f; @Override public void dispose(GLAutoDrawable drawable) { } @Override public void init(GLAutoDrawable drawable) { final GL2 gl = drawable.getGL().getGL2(); gl.glEnable(GL.GL_DEPTH_TEST); // bật chức cho phép loại bỏ phần đối tượng bị che đối tượng khác } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { final GL2 gl = drawable.getGL().getGL2(); if (height