Lý do và động lựcNgày nay con người có nhu cầu chụp ảnh rất nhiều , có những người trong bộ sưu tập có đến hàng trăm , hàng nghìn bức ảnh dẫn đến việc quản lý hay xem lại một ảnh nào đó
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
BÁO CÁO BÀI TẬP LỚN MÔN CẤU TRÚC
DỮ LIỆU VÀ GIẢI THUẬT
Chủ đề: “Image Viewer using linked list”
Giáo viên hướng dẫn: cô Trần Thị Thanh Hải
Danh sách sinh viên nhóm 17:
Trang 2I Giới thiệu 4
1.1 Lý do và động lực 4
1.2 Định nghĩa bài toán 4
1.3 Bảng phân công nhiệm vụ 4
II Phương pháp lựa chọn 5
1 Danh sách liên kết đơn 5
1.1 Con trỏ và struct 5
1.2 Định nghĩa 6
1.3 Đặc điểm của danh sách liên kết đơn 7
2 Giải thuật 7
2.1 Duyệt danh sách 7
2.2 Thêm 1 node vào đầu danh sách 8
2.3 Xóa 1 node khỏi danh sách theo vị trí 8
2.4 Tìm kiếm Node trong danh sách 9
III Triển khai cài đặt 9
1 Ngôn ngữ lập trình và thư viện 9
1.1 Ngôn ngữ lập trình C++ và các thư viện cơ bản 9
1.2 Thư viện openCV 10
2 Tổ chức chương trình 11
IV Kết quả thực nghiệm 13
1 Dữ liệu 13
2 Kết quả thực nghiệm 15
2.1 Test Menu 1 : Hiển thị danh sách ảnh 16
2.2 Test Menu 2 : Thêm ảnh 16
2.3 Test Menu 3: Xóa ảnh 17
2.4 Test Menu 4: Tìm ảnh có lượt xem cao nhất 17
2.5 Test Menu 5: Tìm ảnh theo địa điểm 18
2.6 Test Menu 6: Phân bố ảnh theo năm 18
2.7 Test chức năng ghi file khi đóng chương trình 19
V Kết luận 19
1 Đánh giá mức độ hoàn thành 19
2 Bài học rút ra 19
3 Những khó khắn khi học môn học này 19 Hình ảnh
Trang 3Hình 1 Khai báo con trỏ 5
Hình 2 Khai báo Node 6
Hình 3 Linked List 6
Hình 4 Khai báo 1 Linked List 6
Hình 5 Code duyệt danh sách 7
Hình 6 Thêm node vào đầu danh sách 8
Hình 7 Xóa Node ở đầu 8
Hình 8 Xóa node bất kỳ không phải ở đầu 9
Hình 9 Tìm kiếm Node 9
Hình 10 Code hiển thị ảnh bằng opencv 11
Hình 11 Thư mục data 11
Hình 12 Thư mục img 11
Hình 13 Tạo các thư viện cần thiết 12
Hình 14 Các ảnh có sẵn trong thư mục ảnh 15
Hình 15 File “Image.txt” 15
Hình 16 File "ListImg.txt" 15
Hình 17 Menu 15
Hình 18 Chức năng 1 16
Hình 19 Thêm thất bại do tên ảnh sai hoặc không có ảnh đó trong file “img” 16
Hình 20 Thêm thất bại do ảnh đã tồn tại trong danh sách 16
Hình 21 Thêm thành công ảnh "messi.jpg" 16
Hình 22 Chức năng 3 17
Hình 23 Chức năng 4 17
Hình 24 Chức năng 5 18
Hình 25 Chức năng 6 18
Hình 26 Ghi lại thay đổi vào file "ListImg.txt" 19
Trang 4I Giới thiệu
1.1 Lý do và động lực
Ngày nay con người có nhu cầu chụp ảnh rất nhiều , có những người trong bộ sưu tập có đến hàng trăm , hàng nghìn bức ảnh dẫn đến việc quản lý hay xem lại một ảnh nào đó rất khó khăn.Vì vậy nhóm em quyết định tạo ra ứng dụng Image Viewer giúp người dùng xem,thao tác và quản lý hình ảnh một cách dễ dàng hơn.Ngoài ra tạo 1 Image Viewer sử dụng Linked List giúp người học xây dựng một ứng dụng thực tế , học cách áp dụng cấu trúc dữ liệu vào các ứng dụng thực tế và nâng cao kỹ năng lập trình
1.2 Định nghĩa bài toán
Bài toán “Image Viewer using Linked List” là việc xây dựng trình xem ảnh sử dụng cấu trúc dữ liệu Linked List để quản lý danh sách các ảnh Ứng dụng sẽ có các chức năng:
Phân bố ảnh chụp theo năm
1.3 Bảng phân công nhiệm vụ
Vũ Đăng Tuấn Tạo class “Menu” để xử lý các chức năngNguyễn Trọng Hiếu Tạo class “ImageViewer” với các chức năngTrần Minh Đức Tổng hợp và làm báo cáo
Trần Hưng Sách Tìm tài liệu tham khảo và tìm ảnh
Phân công công việc theo thời gian :
Tuần 1 : Tìm hiểu chủ đề và lên kế hoạch giải quyết bài toán Tuần 2 : Nghiên cứu và bắt đầu viết chương trình
Tuần 3 : Hoàn thiện chương trình và chạy thử
Tuần 4 : Tổng hợp kết quả và làm báo cáo
Trang 5II Phương pháp lựa chọn
1 Danh sách liên kết đơn
1.1 Con trỏ và struct
a Con trỏ
Một con trỏ (pointer) là một biến dùng để lưu trữ địa chỉ của một biến khác Biến khác ở đây có thể là một biến thông thường như biến số nguyên,biến số thực, hoặc có thể là một mảng, một hàm, và có khi cũng chính là một con trỏ khác Vì con trỏ là một biến nên nó cũng cần phải được lưu trữ
ở đâu đó trong bộ nhớ; có nghĩa là bản thân biến con trỏ cũng có một địa
bộ nhớ Do đó, ta có thể dùng con trỏ đề lưu địa chỉ của một con trỏ
khác.
Cú pháp khai báo con trỏ trong C, nói một cách đơn giản (nhưng không hoàn toàn chính xác), gồm 3 phần: (i) kiểu của biến khác mà con trỏ lưu trữ địa chỉ, (2) dấu * và (3) tên của con trỏ Con trỏ hàm thì khai báo hơi khác một chút, nhưng đây không phải vấn đề trọng tâm của bài viết Ví dụ, khai báo một số con trỏ:
b Struct
Struct cho phép chúng ta tập hợp một hoặc một vài kiểu dữ liêu khác nhau thành một kiểu dữ liệu mới Các kiểu dữ liệu thành phần của một struct có thể là kiểu dữ liệu sẵn có như số nguyên, số thực, con trỏ, hoặc một kiểu struct đã định nghĩa trước đó
Trong DSLK, struct được sử dụng để khai báo một “mắt xích” của danh sách Ví dụ ta muốn khai báo một mắt xích của một danh sách liên kết các biến kiểu int thì ta có thể khai báo như sau:
Hinh 1 Khai báo 1 con trỏ
Hinh 2 Khai báo Node
Trang 61.2 Định nghĩa
Danh sách liên kết đơn (Singly Linked List): Mỗi một phần tử (hay còn gọi
là node) trong danh sách liên kết đơn gồm có data và next pointer next ,
pointer sẽ trỏ tới node kế tiếp trong danh sách liên kết đơn Và nếu next pointer trỏ tới NULL thì có nghĩa là node đó là node cuối cùng trong danh sách liên kết đơn
1.3 Đặc điểm của danh sách liên kết đơn
Do danh sách liên kết đơn là một cấu trúc dữ liệu động, được tạo nên nhờ việc cấp phát động nên nó có một số đặc điểm sau đây:
Được cấp phát bộ nhớ khi chạy chương trình
Có thể thay đổi kích thước qua việc thêm, xóa phần tử
Kích thước tối đa phụ thuộc vào bộ nhớ khả dụng của RAM
Các phần tử được lưu trữ ngẫu nhiên (không liên tiếp) trong RAM
Hinh 1 Linked List
Hinh 2 Khai báo 1 Linked List
Trang 7Và do tính liên kết của phần tử đầu và phần tử đứng sau nó trong danh sáchliên kết đơn, nó có các đặc điểm sau:
Chỉ cần nắm được phần tử đầu và cuối là có thể quản lý được danhsách
Truy cập tới phần tử ngẫu nhiên phải duyệt từ đầu đến vị trí đóChỉ có thể tìm kiếm tuyến tính một phần tử
Trang 82.2 Thêm 1 node vào đầu danh sách
Gán next của Node mới trỏ đến Node đầu (cũ): node->next = head;Cập nhập lại giá trị head: head = node;
2.3 Xóa 1 node khỏi danh sách theo vị trí
a Xóa ở đầu danh sách
Bước 1: Khai báo một con trỏ p để lưu lại địa chỉ của Node đầu tiên: Node* temp = head;
o Trường hợp ngoại lệ cần xử lý là nếu danh sách không có phần tử nào thì phải thoát trước khi thực hiện xóa
Bước 2: cập nhập lại giá trị của head: head = head->next;
Bước 3: giải phóng vùng nhớ của Node cần xóa: delete temp;
8
Hinh 4 Thêm node vào đầầu danh sách
Hinh 5 Xóa Node đầầu ở
Trang 9
b Xóa các node còn lại
Bước 1: Khai báo một con trỏ p để lưu lại địa chỉ của Node đầu tiên: Node* temp = head;
Bước 2: Duyệt danh sách để tìm vị trí node cần xóa và node trước nó(prev)
Bước 3: cập nhập lại giá trị next của Node prev: prev->next =
temp->next;
Bước 4: giải phóng vùng nhớ của Node cần xóa: delete temp;
2.4 Tìm kiếm Node trong danh sách
Tạo con trỏ temp trỏ đến node đầu
Duyệt danh sách từ node đầu đến node cuối.nếu temp = node cần tìm thì dừng vòng lặp và trả về temp
III Triển khai cài đặt
1 Ngôn ngữ lập trình và thư viện
1.1 Ngôn ngữ lập trình C++ và các thư viện cơ bản
C++ là một ngôn ngũ lập trình đa năng , có cấp độ cao được phát triển bởi Bjarne Stroustrup vào năm 1983 Nó là một phần mở rộng của ngôn ngữ lập trình C và hỗ trợ các mô hình lập trình hương đối tượng C++ được sử dụng rộng rãi trong việc phất triển hệ điều hành, phần mềm hệ thống, trình
Hinh 6 Xóa node bầất kỳ không ph i đầầu ả ở
Hinh 7 Tim kiêấm Node
Trang 10điều khiển thiết bị , trò chơi video và các uwngs dụng đòi hỏi hiệu suất cao khác.
Các thư viện cần dùng trong bài :
iostream: nhập xuất dữ liệu
string: xử lý chuỗi
vector: lưu trữ thông tin 1 ảnh
map: phân bố ảnh theo năm với “key=năm” và “value=mảng chứa các ảnh cùng năm đó”
fstream : lấy dữ liệu ảnh
opencv2: hiển thị ảnh
1.2 Thư viện openCV
OpenCV là một thư viện mã nguồn mở để phất triển các ứng dụng thịgiác máy tính và xử lý ảnh Thư viện này cung cấp nhiều hàm xử lý ảnh
và video , hỗ trỡ cho nhiều ngôn ngữ lập trình như C++,Python,Java vàC#
OpenCV2 là phiên bản cũ của thư viện OpenCV, được phát hành năm2009.Các tính năng chính của openCV2 :
o Các tính năng phân tích hình ảnh như phát hiện cạnh và đường viền
o Các công cụ đề phát triển các ứng dụng thi giác máy tính và các ứngdụng Al
Cách cài đặt openCV với Visual Studio :
visual-c-tren-windows/
Trang 11Img: chứa ảnh
Hinh 8 Code hi n th nh bằầng opencv ể ị ả
Hinh 9 Th m c data ư ụ
Hinh 10 Th m c img ư ụ
Trang 12Header file: chứa các file header
struct Imagestring name - tên
string resolution - độ phân giảistring location - địa điểm
string date - thời gian
int views - sô lượt xem
Image() – hàm tạo rỗng
Image(…) – hàm tạo có tham sốvoid showImage() – hàm hiển thị ảnhbool addImage() – hàm thêm ảnh
Struct nodeImage data – thông tin ảnh
node *next – con trỏ next
Hinh 11 T o các th vi n cầần thiêất ạ ư ệ
Trang 13node(Image img) – Hàm khởi tạo 1 node
class ImageViewer – tạo 1 linked list với các chức năng node *head – node đầu
int count – số lượng node
ImageViewer() – hàm khởi tạo rỗng
void add(Image img) – thêm 1 node vào đầu
void remove(int index) – xóa 1 node theo vị trí
vector<Image*> mostViews() – tìm ảnh nhiều views nhấtvector<Image*> find(string location) – tìm ảnh theo địa điểmmap<string,vector<Image*> > filter() – phân bố ảnh theo nămvector<Image*> listImg() – lấy tất cả ảnh bỏ vào mảng
Class MENU – xử lý các chức năng
ImageViewer iv – khai báo 1 Linked List
vector<Image*> readfile(string fileName) – lấy ảnh từ file txtMENU() – hàm tạo để thêm ảnh từ file “ListImg.txt” vào dsach
~MENU() – hàm hủy để lưu thay đổi vào file “ListImg.txt” khi đóng chương trình
void menu() – hàm menu
void print(vector<Image*> img) – in danh sách ảnh theo yêu cầuCác hàm thực hiện chức năng từ 1 đến 6
Trang 14Source file: chứa file main.cpp đề chạy chương trình
IV Kết quả thực nghiệm
1 Dữ liệu
Nhóm em đã sưu tầm được khoảng 50 bức ảnh của các cầu thủ bóng đá trên thếgiới
ST
Trang 1518 garnacho.jpg 365dpi Argentina 12/01/2023
Trang 1640 mitoma.jpeg 300dpi Nhat Ban 15/01/2018
45 bruno fernandes.jfif 300dpi Bo Dao Nha 15/04/2023
Trang 172 Kết quả thực nghiệm
2.1 Test Menu 1: Hiển thị danh sách ảnh
2.2 Test Menu 2: Thêm nh ả
Hinh 12 Các nh có sằẵn trong th m c nh ả ư ụ ả
Hinh 13 File “Image.txt”
Hinh 14 File "ListImg.txt"
Hinh 15 Menu
Hinh 16 Ch c nằng 1 ứ
Trang 182.3 Test Menu 3: Xóa ảnh
2.4 Test Menu 4: Tìm ảnh có lượt xem cao nhất
Hinh 17 Thêm thầất b i do nh đã tôần t i ạ ả ạ
trong danh sách
Hinh 20 Ch c nằng 3 ứ Hinh 18 Thêm thầất b i do tên nh sai ho c không có nh đó trong fle ạ ả ặ ả
“img”
Trang 19Như đã xem ở trên thì ảnh “gavi” và “messi” được xem nhiều nhất với views
Trang 202.6 Test Menu 6: Phân bố ảnh theo năm
2.7 Test chức năng ghi file khi đóng chương trình
Trang 21Xem ảnh và thông tin ảnh
cơ bản trên danh sách như thêm, xóa, duyệt, tìm kiếm
Ngoài ra, bài toán cũng giúp chúng ta nhận thức được rằng việc lưu trữ
và quản lý dữ liệu là một phần rất quan trọng trong lập trình Nếu không
có cấu trúc dữ liệu phù hợp, việc thao tác trên dữ liệu sẽ trở nên khó khăn và tốn thời gian
Cuối cùng, bài toán cũng giúp chúng ta rèn luyện kỹ năng lập trình và tưduy thuật toán, từ đó giúp chúng ta trở nên thành thạo hơn trong lập trình và giải quyết các bài toán khó hơn
3 Những khó khắn khi học môn học này
Môn học Cấu trúc dữ liệu và Giải thuật có thể đòi hỏi nhiều nỗ lực và thời gian để học và làm quen với các khái niệm và phương pháp Một số khó khăn cụ thể khi học môn này có thể bao gồm:
Khái niệm phức tạp: Cấu trúc dữ liệu và giải thuật có nhiều khái niệm phức tạp và trừu tượng, nhưng lại là cơ sở cho nhiều ứng dụng
và thuật toán phức tạp Việc hiểu rõ các khái niệm này và ứng dụng chúng vào thực tế có thể đòi hỏi nhiều thời gian và nỗ lực
Nhiều thuật toán và phương pháp: Có nhiều thuật toán và phương pháp khác nhau để giải quyết các bài toán sử dụng cấu trúc dữ liệu vàgiải thuật, việc hiểu và áp dụng chúng có thể khó khăn
Trang 22Tài liệu tham khảo
Thư viện map: https://cplusplus.com/reference/map/map/?kw=map
Thư viện vector: https://cplusplus.com/reference/vector/vector/?kw=vector
Thư viện string: https://cplusplus.com/reference/string/string/?kw=string
OpenCV: opencv-visual-c-tren-windows/