1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO CÁO BÀI TẬP LỚN Môn Xử lý ảnh trong công nghiệp

163 34 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Báo Cáo Bài Tập Lớn Môn Xử Lý Ảnh Trong Công Nghiệp
Tác giả Vũ Hoàng Dũng, Đỗ Đức Chính, Nguyễn Duy Trung, Đào Phương Nam, Bùi Đức Lương
Người hướng dẫn Phí Văn Lâm, Thầy
Trường học Trường Đại học Giao Thông Vận Tải
Chuyên ngành Xử lý ảnh trong công nghiệp
Thể loại Bài tập lớn
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 163
Dung lượng 9,28 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các số liệu này được biến đổi thànhcác dạng thích hợp cho việc xử lý tiếp theo bằng máy tính, sau đóảnh sẽ được chọn các tích chất để thể hiện hay còn gọi là trích chọnđặc trưng Feat

Trang 1

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI

KHOA ĐIỆN - ĐIỆN TỬ

BỘ MÔN ĐIỀU KHIỂN HỌC

Lớp: Tự Động Hóa-K59

Giảng viên hướng dẫn: Phí Văn Lâm

Hà Nội, 27 /02 /2022.

Trang 2

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI



BÀI TẬP LỚN XỬ LÝ ẢNH

Giảng viên hướng dẫn: thầy Phí Văn Lâm

Lớp chuyên ngành: Tự động hóa 1 – Khóa 59

Sinh viên thực hiện: Đỗ Đức Chính

Bùi Đức Lương

Vũ Hoàng Dũng

Nguyễn Duy Trung

Đào Phương Nam

Hà Nội – 2021

Trang 3

Mục lục

Danh mục các từ viết tắt 4

Chương 1: Lý thuyết chung 5

1 Ảnh số 5

1.1 Ảnh số là gì? 5

1.2 Xử lý ảnh với Matlab 7

1.3 Các hàm xử lý ảnh trong Matlab 11

2 Xử Lý Ảnh Với OpenCV 21

2.1 OpenCV là gì? 21

2.2 Cách load ảnh và hiển thị một ảnh với OpenCV trong C++ 22

2.3 Điều chỉnh độ sáng và độ tương phản trong ảnh 23

2.4 Phóng to, thu nhỏ và xoay ảnh 25

Chương 2: Bài tập vận dụng 30

I MÃ VẠCH TRÊN SẢN PHẨM 30

1.1 Lịch sử hình thành và phát triển mã vạch 30

1.2 Mã vạch là gì? 31

1.3 Phân loại mã vạch 31

1.4 Cấu tạo của mã vạch 35

1.5 Chương trình phát hiện và giải mã mã vạch sử dụng thư viện OPENCV và ZBAR 36

1.6 Hình ảnh chương trình khi chạy và cho ra kết quả 39

II Chương trình nhận dạng biển số xe 41

2.1 Hình ảnh chương trình khi thực hiện xử lý 41

2.2 Code chương trình nhận dạng biển số: 42

Trang 4

2.3 Hướng dẫn tạo và khởi chạy chương trình 84

III Chương trình đếm xe ô tô lưu thông trên đường 91

3.1 Hình ảnh chương trình khi thực hiện xử lý 91

3.2 Code chương trình đếm số xe lưu thông trên làn đường 91

3.3 Hướng dẫn khởi tạo và chạy chương trình 112

IV Chương trình nhận diện vật thể theo hình dạng 117

4.1 Hình ảnh chương trình phát hiện và nhận dạng 117

4.2 Code chương trình nhận dạng hình dạng 117

4.3 Hướng dẫn khởi tạo và chạy chương trình 121

V Chương trình nhận diện màu sắc 125

5.1 Hình ảnh chương trình phát hiện và nhận dạng 125

5.2 Code chương trình nhận diện màu sắc 125

5.3 Hướng dẫn khởi tạo và chạy chương trình 129

Chương 3: Giải đề thi 130

Bài 1: 130

Bài 2: 131

Bài 3: 132

Phụ lục 134

1 Cài đặt Visual Studio 134

2 Cài đặt OpenCV 4.5.0 139

3 Cài đặt thư viện OpenCV 3.1.0 145

4 Cài đặt thư viện OpenCV 2.4.13 146

5 Cài đặt thư viện ZBAR phục vụ cho chương trình đọc mã vạch 148

Trang 5

Danh mục các từ viết tắt

CCIR Campaign for Comprehensive Immigration Reform

CMYK Cyan – Magenta – Yellow - Key

Trang 6

Chương 1: Lý thuyết chung (Nguyễn Duy Trung)

1 Ảnh số

1.1 Ảnh số là gì?

Ả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 đặc đ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

a Điểm ảnh (Picture Element)

Điểm ảnh (Pixel) là một phần tử của ảnh số tại tọa độ (x, y) với độ xámhoặ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

b Mức xám của ảnh

Mức xám là kết quả của sự biến đổi tương ứng 1 giá trị độ sáng của 1 điểm ảnh với 1 gía trị nguyên dương Thông thường nó xác định trong [0, 255] tùy thuộc vào giá trị mà mỗi điểm ảnh được biểu diễn Các thang giá trị mức xám thông thường: 16, 32, 64, 128, 256 Mức 256 là mức phổ dụng vì từ kỹ thuật máy tính dùng 1 byte (8 bit) để biểu diễn mức xám Mức xám dùng một byte biểu diễn : 28 = 256 mức, tức là từ

0 đến 255

c Độ phân giải của ảnh

Độ phân giải của ảnh (Resolution) của ảnh là mật độ điểm ảnh được ấn định trên một ảnh số được hiển thị 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

Trang 7

giải của ảnh trên màn hình CGA (Color Graphic Adaptor) là một lưới điểm theo chiều ngang màn hình: 320 điểm chiều dọc*200 điểm ảnh (320*200).

Rõ ràng cùng màn hình CGA 12” ta nhận thấy mịn hơn màn hình CGA 17” độ phân giải 320*200 Vì cùng một mật độ nhưng diện tích mà hình rộng hơn thì độ mịn ( độ liên tục của các điểm) kém hơn

P(x, y) = (R, G, B)

– Hệ màu CMY: là phần bù của hệ màu RGB

(C, M, Y) = (1, 1, 1) – (R, G, B)

Hay C+R=M+G=Y+B=1

=> Hệ màu này thường được dùng trong máy in

– Hệ màu CMYK trong đó K là độ đậm nhạt của màu K= min(C,M,Y)P(x, y) = (C-K, M-K, V-K, K)

e Các giai đoạn xử lý ảnh

Trang 8

Hình 1-1: Các giai đoạn xử lý ảnh 1.2 Xử lý ảnh với Matlab

a Xử lý ảnh

Đầu tiên, hình ảnh từ thế giới bên ngoài được các thiết bị thu nhận, ghi hình ảnh như camera, máy chụp hình, máy quét, Trước đây, ảnh thu qua Camera là các ảnh tương tự (loại Camera ống kiểu CCIR) Giờ đây,với sự phát triển của công nghệ, ảnh màu hoặc đen trắng được lấy ra từ Camera, sau đó nó được chuyển trực tiếp thành ảnh số tạo thuận lợi cho

xử lý tiếp theo Ngoài ra, ảnh cũng có thể tiếp nhận từ vệ tinh,

b Các giai đoạn xử lý ảnh

Hình 1-2: Các giai đoạn xử lý ảnh trong matlab

- Thu nhận ảnh (Image Acquisition): Ảnh được thu từ các nguồn như

máy ảnh, máy quay phim, máy quét, ảnh vệ tinh…Ảnh này có thể làảnh màu hoặc trắng đen, chất lượng ảnh phụ thuộc vào thiết bị thunhận hình ảnh

- Tiền xử lý (Image Processing): Sau khi ảnh được thu vào được xử lý

để chất lượng ảnh tốt lên qua việc điều chỉnh độ chiếu sáng, hiệuchỉnh giá trị độ sáng giữa nền và đối tượng, giảm nhỏ thành phầnnhiễu, điều chỉnh bọ lọc và khuếch đại

Trang 9

- Phân đoạn (Segmentation): tách ảnh đầu vào thành các vùng đói

tượng khác nhau

- Biểu diễn ảnh (Image Representation): Đầu ra ảnh sau phân đoạn

chứa các điểm ảnh của vùng ảnh (ảnh đã phân đoạn) cộng với mãliên kết với các vùng lận cận Các số liệu này được biến đổi thànhcác dạng thích hợp cho việc xử lý tiếp theo bằng máy tính, sau đóảnh sẽ được chọn các tích chất để thể hiện hay còn gọi là trích chọnđặc trưng (Feature Selection) gắn với việc tách các đặc tính của ảnhdưới dạng các thông tin định lượng hoặc là làm cơ sở để phân biệtlớp đối tượng này với đối tượng khác trong phạm vi ảnh nhận được

- Nhận dạng và nội suy ảnh (Image Recognition and Interpretation):

nhận dạng là quá trình xác định ảnh bằng cách so sánh với mẫuchuẩn đã được chọn hoặc lưu từ trước Nội suy là phán đoán ảnhtheo ý nghĩa trên cơ sở nhận dạng Các đối tượng nhận dạng phổbiến hiện nay được áp dụng trong khoa học và công nghệ: nhậndạng ký tự( chữ viết tay, chữ in, chữ ký điện tử), nhận dạng văn bản,nhận dạng hình ảnh ( vân tay, mặt người, mã vạch, )

- Cơ sở tri thức (Knowledge Base): Một đối tượng khá phức tạp về

đường nét, độ sáng tối, dung lượng điểm ảnh, môi trường để thu ảnhphong phú kéo theo nhiễu Trong nhiều khâu xử lý và phân tích ảnhcần đơn giản hóa các phương pháp toán học đảm bảo tiện lợi cho xử

lý giống quy trình tiếp nhận và xử lý ảnh theo cách của con người, ởđây các cơ sở tri thức được phát huy

- Mô tả và phát huy: Ảnh sau khi được số hóa sẽ được chuyển sang

khu vực lưu trữ phục vụ cho các công đoạn tiếp theo Nếu lưu trữtrực tiếp từ ảnh thô thì dung lượng lưu trữ sẽ rất lớn, vì vậy cần mô

tả, biểu diễn sao cho dung lượng lưu trữ là thấp nhất, để tiết kiệm bộnhớ cũng như tiết kiệm thời gian làm việc

c Các kiểu ảnh trong Matlab

Trang 10

 Ảnh được định chỉ số (Indexed Images)

Một ảnh chỉ số bao gồm một ma trận dữ liệu X và ma trận bản đồ màu map Ma trận dữ liệu có thể có kiểu thuộc lớp uint8, uint16 hoặc kiểu double Ma trận bản đồ màu là một mảng mx3 kiểu double bao gồm cácgiá trị dấu phẩy động nằm giữa 0 và 1 Mỗi hàng của bản đồ chỉ ra các giá trị red, green và blue của một màu đơn Một ảnh chỉ số sử dụng ánh

xạ trực tiếp giữa giá trị của pixel ảnh tới giá trị trong bản đồ màu Màu sắc của mỗi pixel ảnh được tính toán bằng cách sử dụng giá trị tương ứng của X ánh xạ tới một giá trị chỉ số của map Giá trị 1 chỉ ra hàng đầu tiên, giá trị 2 chỉ ra hàng thứ hai trong bản đồ màu …

Một bản đồ màu thường được chứa cùng với ảnh chỉ số và được tự động nạp cùng với ảnh khi sử dụng hàm imread để đọc ảnh Tuy nhiên, không bị giới hạn khi sử dụng bản đồ màu mặc định, có thể sử dụng bất

kì bản đồ màu nào

 Ảnh cường độ (Intensity Images)

Một ảnh cường độ là một ma trận dữ liệu ảnh I mà giá trị của nó đại diện cho cường độ trong một số vùng nào đó của ảnh Matlab chứa mộtảnh cường độ như một ma trận đơn, với mỗi phần tử của ma trận tương ứng với một pixel của ảnh Ma trận có thể thuộc lớp double, uint8 hay uint16 Trong khi ảnh cường độ hiếm khi được lưu với bản đồ màu, Matlab sử dụng bản đồ màu để hiển thị chúng

Những phần tử trong ma trận cường độ đại diện cho các cường độ khác nhau hoặc độ xám Những điểm có cường độ bằng 0 thường được đại diện bằng màu đen và cường độ 1,255 hoặc 65535 thường đại diện cho cường độ cao nhất hay màu trắng

 Ảnh nhị phân (Binary Images)

Trang 11

Trong một ảnh nhị phân, mỗi pixel chỉ có thể chứa một trong hai giá trị nhị phân 0 hoặc 1 Hai giá trị này tương ứng với bật hoặc tắt (on hoặc off) Một ảnh nhị

phân được lưu trữ như một mảng logic của 0 và 1

 Ảnh RGB (RGB Images)

Một ảnh RGB – thường được gọi là true-color, được lưu trữ trong Matlab dưới dạng một mảng dữ liệu có kích thước 3 chiều mxnx3 định nghĩa các giá trị màu red, green và blue cho mỗi pixel riêng biệt Màu của mỗi pixel được quyết định bởi sự kết hợp giữa các giá trị R, G, B (Red, Green, Blue) được lưu trữ trong một mặt phẳng màu tại vị trí của pixel Định dạng file đồ hoạ lưu trữ ảnh RGB giống như một ảnh 24 bits trong đó R, G, B chiếm tương ứng 8 bit một Điều này cho phép nhận được 16 triệu màu khác nhau

Một mảng RGB có thể thuộc lớp double, uint8 hoặc uint16 Trong một mảng RGB thuộc lớp double, mỗi thành phần màu có giá trị giữa 0 và

1 Một pixel mà thành phần màu của nó là (0, 0, 0) được hiển thị với màu đen và một pixel mà thành phần màu là (1, 1, 1 ) được hiển thị với màu trắng Ba thành phần màu của mỗi pixel được lưu trữ cùng với chiều thứ 3 của mảng dữ liệu Chẳng hạn, giá trị màu R, G, B của pixel (10, 5) được lưu trữ trong RGB(10, 5, 1), RGB(10, 5, 2) và RGB(10, 5, 3) tương ứng

Để tính toán màu sắc của pixel tại hàng 2 và cột 3 chẳng hạn, ta nhìn vào bộ ba giá trị được lưu trữ trong (2, 3, 1:3) Giả sử (2, 3, 1) chứa giá trị 0.5176; (2, 3, 2) chứa giá trị 0.1608 và (2, 3, 3) chứa giá trị 0.0627 thì màu sắc của pixel tại (2, 3) sẽ là (0.5176, 0.1608, 0.0627)

1.3 Các hàm xử lý ảnh trong Matlab

a Đọc và ghi dữ liệu

Trang 12

• Đọc một ảnh đồ hoạ.

– Hàm imread đọc một ảnh bất kỳ với các định dạng được hỗ trợ như: bmp, gif, jpeg, tiff, Ví dụ, đoạn mã sau sẽ đọc một ảnh RGB vào không gian làm việc của Matlab lưu trong biến RGB

RGB = imread(‘football.jpg’);

• Đọc nhiều ảnh từ một file đồ hoạ

– Matlab trợ giúp một số định dạng file đồ hoạ chẳng hạn như: HDF và TIFF, chúng chứa nhiều ảnh Theo mặc định, imread chỉ trợ giúp ảnh đầu tiên trong file Để nhập thêm các ảnh từ file, sử dụng cú pháp được trợ giúp bởi định dạng file

Ví dụ sau đây đọc một chuỗi 27 ảnh từ một file TIFF và lưu những ảnh này trong một mảng 4 chiều Ta có thể sử dụng hàm iminfo để xem baonhiêu ảnh đã được lưu trữ trong file:

• Ghi một ảnh đồ hoạ

– Hàm imwrite sẽ ghi một ảnh tới một file đồ hoạ dưới một trong các định dạng được trợ giúp Cấu trúc cơ bản nhất của imwrite sẽ yêu cầu một biến ảnh và tên file Nếu ta gộp một phần mở rộng trong tên file,

Trang 13

– Khi sử dụng imwrite với một số định dạng đồ hoạ, ta có thể chỉ ra cáctham số phụ Ví dụ: Imwrite(I,’clown.png’,’BitDepth’,4);

• Đọc và ghi ảnh nhị phân theo định dạng 1 bit

– Trong một số định dạng file, một ảnh nhị phân có thể được lưu trong một định dạng 1 bit Khi ta đọc một ảnh nhị phân với định dạng 1 bit, Matlab đại diện nó trong không gian làm việc như một mảng lôgic.– Ví dụ sau đọc một ảnh nhị phân và ghi nó dưới dạng file TIFF Bởi vìđịnh dạng TIFF trợ giúp ảnh 1 bit, file được ghi lên đĩa theo định dạng

• Xem lớp lưu trữ của file

– Hàm imwrite sử dụng luật sau đây để quyết định lớp lưu trữ được sử dụng trong ảnh kết quả:

+ logical: Nếu định dạng ảnh ra (Output Image) được chỉ rõ là trợ giúp ảnh 1 bit, hàm imwrite tạo một file ảnh 1 bit Nếu định dạng ảnh ra được chỉ rõ là không trợ giúp ảnh 1 bit (như JPEG), hàm imwrite

Trang 14

+ uint8: Nếu định dạng ảnh ra được chỉ rõ là trợ giúp ảnh 8 bit, hàm imwrite tạo một ảnh 8 bit

+ uint16: Nếu định dạng ảnh ra được chỉ rõ trợ giúp ảnh 16 bit (PNG hoặc TIFF), hàm imwrite tạo một ảnh 16 bit Nếu định dạng ảnh ra không trợ giúp ảnh 16 bit, hàm chuyển đổi dữ liệu ảnh tới lớp uint8 và tạo một ảnh 8 bit

+ double: Matlab chuyển dữ liệu ảnh tới dạng uint8 và tạo một ảnh 8 bit bởi vì hầu hết các file ảnh sử dụng định dạng 8 bit

Truy vấn một file đồ hoạ

– Hàm imfinfo cho phép ta có thể nhận được thông tin về một file ảnh được trợ giúp bởi toolbox

Cú pháp: imfinfo(filename,fmt)

Các thông tin được cung cấp bởi hàm imfinfo là: filename,

filemodedate, filesize, format, formatversion, width, height, bitdepth, colortype … Thông tin mà ta nhận được phụ thuộc vào kiểu của file nhưng nó luôn bao gồm những thông tin sau: Tên của file ảnh, định dạng fiel ảnh, số version của định dạng file, ngày sửa đổi gấn nhất, kíchthước file tính theo byte, chiều rộng ảnh tính theo pixel, chiều cao ảnh tính theo pixel, số lượng bit trên 1 pixel, kiểu ảnh,

Trang 15

– Nếu ta gọi hàm imview mà không chỉ ra mất kì tham số nào, nó sẽ hiển thị một hộp chọn file cho phép ta chỉ ra tên file muốn hiển thị.

• Xem nhiều ảnh

– Nếu ta chỉ ra một file mà chứa nhiều ảnh, hàm imview chỉ hiển thị ảnh đầu tiên trong file đó Để xem tất cả các ảnh trong file, sử dụng hàm imread để nhập mỗi ảnh vào trong không gian làm việc của Matlabsau đó gọi hàm imview nhiều lần để hiển thị mỗi ảnh riêng biệt

• Dùng hàm imshow

– Để xem ảnh, ta có thể sử dụng hàm imshow thay cho imview Ta sử dụng imshow để hiển thị một ảnh đã được nhập vào trong không gian làm việc như ví dụ sau:

Trang 16

liệu ảnh từ handle của một đối tượng ảnh hiện tại Chẳng hạn: moon = getimage; Sẽ gán dữ liệu ảnh từ moon.tif vào biến moon.

b Các hàm chuyển đổi kiểu ảnh

Với các thao tác nhất định sẽ thật hữu ích khi có thể chuyển đổi ảnh từ dạng này sang dạng khác Chẳng hạn, nếu ta muốn lọc một màu ảnh được lưu trữ dưới dạng ảnh chỉ số đầu tiên ta nên chuyển đổi nó thành dạng ảnh RGB

Khi ta áp dụng phép lọc tới ảnh RGB, Matlab sẽ lọc giá trị cường độ trong ảnh tương ứng Nếu ta cố gắng lọc ảnh chỉ số, Matlab đơn giản chỉ áp đặt phép lọc tới ma trận ảnh chỉ số và kết quả sẽ không có ý nghĩa

– Danh sách sau đây sẽ liệt kê các hàm được sử dụng trong việc chuyểnđổi kiểu ảnh:

 dither: Tạo một ảnh nhị phân từ một ảnh cường độ đen trắngbằng cách trộn, tạo một ảnh chỉ số từ một ảnh RGB bằng cáchtrộn (dither)

 gray2id: Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng

 grayslice: Tạo một ảnh chỉ số từ một ảnh cường độ đen trắngbằng cách đặt ngưỡng

 im2bw: Tạo một ảnh nhị phân từ một ảnh cường độ, ảnh chỉ sốhay ảnh RGB trên cơ sở của ngưỡng ánh sáng

 ind2gray: Tạo một ảnh cường độ đen trắng từ một ảnh chỉ số

 ind2rgb: Tạo một ảnh RGB từ một ảnh chỉ số

 mat2gray: Tạo một ảnh cường độ đen trắng từ dữ liệu trong một

ma trận bằng cách lấy tỉ lệ giữ liệu

 rgb2gray: Tạo một ảnh cường độ đen trắng từ một ảnh RGB

 rgb2ind: Tạo một ảnh chỉ số từ một ảnh RGB

Trang 17

– Ta cũng có thể thực hiện các phép chuyển đổi kiểu chỉ sử dụng cú pháp của Matlab Chẳng hạn, ta có thể chuyển đổi một ảnh cường độ sang ảnh RGB bằng cách ghép nối 3 phần copy của ma trận ảnh gốc giữa 3 chiều:

RGB = cat(3,I,I,I);

– Ảnh RGB thu được có các ma trận đồng nhất cho các mặt phẳng R,

G, B vì vậy ảnh hiển thị giống như bóng xám

– Thêm vào những công cụ chuyển đổi chuẩn đã nói ở trên, cũng có một số hàm mà trả lại kiểu ảnh khác như một phần trong thao tác mà chúng thực hiện

 Chuyển đổi không gian màu

– Toolbox xử lý ảnh biểu diễn màu sắc như các giá trị RGB ( trực tiếp trong ảnh RGB hoặc gián tiếp trong ảnh chỉ số ) Tuy nhiên, có các phương pháp khác cho việc biểu diễn màu sắc Chẳng hạn, một màu có thể được đại diện bởi các giá trị hue, saturation và các giá trị thành phần (HSV) Các phương pháp khác cho việc biểu diễn màu được gọi

là không gian màu

– Toolbox cung cấp một tập các thủ tục để chuyển đổi giữa các không gian màu Các hàm xử lý ảnh tự chúng coi dữ liệu màu sắc dưới dạng RGB tuy nhiên, ta có thể xử lý một ảnh mà sử dụng các không gian màu khác nhau bằng cách chuyển đổi nó sang RGB sau đó chuyển đổi ảnh đã được xử lý trở lại không gian màu ban đầu

 Chuyển đổi định dạng các file ảnh

Để thay đổi định dạng đồ hoạ của một ảnh, sử dụng hàm imread để đọc một ảnh và sau đó lưu nó với hàm imwrite đồng thời chỉ ra định dạng tương ứng

Trang 18

– Để minh hoạ, ví dụ sau đây sử dụng hàm imread để đọc một file BMPvào không gian làm việc.Sau đó, hàm imwrite lưu ảnh này dưới định dạng PNG

– Ta có thể thực hiện số học ảnh sử dụng các toán tử số học của Matlab.Toolbox xử lý ảnh bao gồm một tập hợp các hàm ứng dụng các phép toán

số học trên tất cả các con số không lấp đầy Hàm số học của toolbox chấp nhận bất kì kiểu dữ liệu số nào bao gồm uint8, uint16 hay double và trả lại ảnh kết quả trong cùng định dạng Các hàm thực hiện các phép toán với độchính xác kép trên từng phần tử nhưng không chuyển đổi ảnh tới giá trị chính xác kép trong không gian làm việc của Matlab Sự tràn số được điều khiển tự động Hàm sẽ cắt bỏ giá trị trả về để vừa với kiểu dữ liệu

 Luật cắt bỏ trong số học ảnh

– Kết quả của số học nguyên có thể dễ dàng tràn số dùng cho lưu trữ Chẳng hạn, giá trị cực đại ta có thể lưu trữ trong uint8 là 255 Các phép toán số học có thể trả về giá trị phân số – không được biểu diễn bởi một chuỗi số nguyên

– Các hàm số học ảnh sử dụng những luật này cho số học nguyên:

Trang 19

+ Giá trị phân số được làm tròn Chẳng hạn, nếu dữ liệu có kiểu uint8, kết quả trả về nếu lớn hơn 255 ( bao gồm Inf ) thì được gán là 255.

 Lời gọi lồng nhau tới hàm số học ảnh

– Ta có thể sử dụng các hàm số học ảnh kết hợp để thực hiện một chuỗi các phép toán Chẳng hạn để tính giá trị trung bình của hai ảnh:

– Khi được sử dụng với kiểu uint8 hay uint16, mỗi hàm số học cắt kết quả của

nó trước khi truyền nó cho hàm thiếp theo Sự cắt bỏ này có thể giảm đáng kể lượng thông tin trong ảnh cuối cùng Một cách làm tốt hơn để thực hiện một chuỗi các tính toán là sử dụng hàm imlincomb Hàm này thi hành tất cả các phép toán số học trong sự kết hợp tuyến tính của độ chính xác kép và chỉ cắt

bỏ kết quả cuối cùng:

K = imlincomb(.5,I,.5,I2);

 Biến đổi không gian ảnh

Biến đổi không gian ảnh là thực hiện ánh xạ giữa vị trí các pixel trong ảnh vào với các pixel trong ảnh ra

 Bảng thuật ngữ

Aliasing : Răng cưa – xuất hiện khi giảm kích thước ảnh Khi kích thước của một ảnh bị giảm, các pixel gốc bị lấy mẫu giảm để tạo ra ít pixel hơn

Trang 20

Aliasing xảy ra như kết quả của việc giảm kích thước ảnh thường xuất hiện dưới dạng bậc thang ( đặc biệt trong các ảnh có độ tương phản cao )

Antialiasing : Các biện pháp chống răng cưa cho ảnh

Bicubic interpolation : Giá trị của các pixel ra được tính toán từ giá trị trung bình của 4×4 pixel lân cận

Bilinear interpolation : Gía trị của pixel ra được tính toán từ giá trị trung bình của 2×2 pixel lân cận

Geometric operation : Một thao tác sửa đổi quan hệ hình học gữa các pixel trong một ảnh Chẳng hạn thay đổi kích thước ảnh, quay ảnh và xén ảnh

Interpolation : Quá trình được sử dụng để ước lượng giá trị ảnh ở một vị trí giữa các pixel

Nearest-neighbor interpolation : Các giá trị pixel ra được gán giá trị của pixel nằm trong một vùng gần pixel đó

 Nội suy

Nội suy là quá trình sử dụng để ước lượng một giá trị ảnh ở một vị trí giữa các pixel Chẳng hạn, nếu ta thay đổi kích thước một ảnh, nó sẽ chứa nhiềupixel hơn ảnh gốc, toolbox sử dụng sự nội suy để tính giá trị cho các pixel thêm vào Hàm imresize và imrotate sử dụng nội suy hai chiều để thực hiện thao tác của mình Hàm improfile cũng sử dụng sự nội suy hoá

Các phương pháp nội suy

– Toolbox sử lý ảnh cung cấp 3 cách nội suy hoá

+ Nội suy các pixel gần nhất ( nearest –neighbor interpolation )

+ Nội suy song tuyến tính ( Bilinear interpolation )

+ Nội suy song khối ( Bicubic interpolation )

Trang 21

Các phương pháp nội suy làm việc theo một cách giống nhau Trong mỗi trường hợp, để tính giá trị của một pixel đã được nội suy, chúng tìm điểm trong ảnh ra mà pixel nằm tại đó Sau đó, chúng gán một giá trị tới các pixel ra bằng cách tính toán giá trị trung bình có trọng số của một số pixel lân cận Trọng số dựa trên cơ sở khoảng cách tới điểm đang xét.

– Các phương pháp này khác nhau ở tập các pixel mà chúng xem xét:+ Với nội suy các pixel gần nhất: pixel ra được gán giá trị của các pixel ở gần nó nhất Các pixel khác không được xem xét

+ Nội suy song tuyến tính, giá trị của pixel ra là giá trị trung bình theo trọng số của 2×2 pixel lân cận

+ Nội suy song khối: giá trị của pixel ra là trung bình có trọng số của 4×4 pixel lân cận

Số lượng các pixel được xem xét ảnh hưởng đến độ phức tạp tính toán

Vì vậy, phương pháp song tuyến tính mất nhiều thời gian hơn phương pháp thứ nhất và

phương pháp song khối mất nhiều thời gian hơn song tuyến tính Tuy nhiên, số lượng pixel lớn hơn, độ chính xác sẽ tốt hơn

2 Xử Lý Ảnh Với OpenCV

2.1 OpenCV là gì?

OpenCV được thiết kế một cách tối ưu, sử dụng tối đa sức mạnh của các dòngchip đa lõi… để thực hiện các phép tính toán trong thời gian thực, nghĩa là tốc

độ đáp ứng của nó có thể đủ nhanh cho các ứng dụng thông thường OpenCV

là thư viện được thiết kế để chạy trên nhiều nền tảng khác nhau patform), nghĩa là nó có thể chạy trên hệ điều hành Window, Linux, Mac, iOS

Trang 22

(cross-… Việc sử dụng thư viện OpenCV tuân theo các quy định về sử dụng phầnmềm mã nguồn mở BSD do đó bạn có thể sử dụng thư viện này một cáchmiễn phí cho cả mục đích phi thương mại lẫn thương mại.

Dự án về OpenCV được khởi động từ những năm 1999, đến năm 2000 nóđược giới thiệu trong một hội nghị của IEEE về các vấn đề trong thị giác máy

và nhận dạng, tuy nhiên bản OpenCV 1.0 mãi tới tận năm 2006 mới chínhthức được công bố và năm 2008 bản 1.1 (pre-release) mới được ra đời Tháng

10 năm 2009, bản OpenCV thế hệ thứ hai ra đời (thường gọi là phiên bản2.x), phiên bản này có giao diện của C++ (khác với phiên bản trước có giaodiện của C) và có khá nhiều điểm khác biệt so với phiện bản thứ nhất

Thư viện OpenCV ban đầu được sự hỗ trợ từ Intel, sau đó được hỗ trợ bởWillow Garage, một phòng thí nghiệm chuyên nghiên cứu về công nghệrobot Cho đến nay, OpenCV vẫn là thư viện mở, được phát triển bởi nguồnquỹ không lợi nhuận (none -profit foundation) và được sự hưởng ứng rất lớncủa cộng đồng

2.2 Cách load ảnh và hiển thị một ảnh với OpenCV trong C++.

Trang 23

Trong OpenCV với giao diện C++, tất cả các kiểu dữ liệu ảnh, ma trận đều

được lưu dưới dạng cv::Mat Hàm imread sẽ đọc ảnh đầu vào và lưu vào

biến img Nguyễn mẫu của hàm này như sau: cv::Mat imread(const

std::string &filename, int flags) trong đó, filename là đường dẫn tới file

ảnh, nếu file ảnh không nằm trong thư mục làm việc hiện hành thì ta phải chỉ

ra đường dẫn tương đối có dạng như D:\Anh\abc.jpg Flags là tham số loại

ảnh mà ta muốn load vào, cụ thể nếu muốn load ảnh màu thì ta

để CV_LOAD_IMAGE_COLOR, nếu là ảnh xám thì ta

để CV_LOAD_IMAGE_GRAYSCALE….

Để hiển thị ảnh lên màn hình ta phải tạo ra một cửa sổ,

hàm namedWindow(const std::string &winname, int flags) sẽ tạo ra cửa sổ

với tiêu đề cửa sổ là một chuỗi string winname Tham số flags sẽ chỉ ra kiểu cửa sổ muốn tạo: nếu tham số CV_WINDOW_AUTOSIZE được sử dụng thì

kích cỡ cửa sổ tạo ra sẽ được hiển thị một cách tự động tùy thuộc vào kích

số CV_WINDOW_AUTOSIZE_FULLSCREEN kích thước cửa sổ sẽ khít với

màn hình máy tính…

Hàm imshow(const std::string winname, cv::InputArray Mat) sẽ hiển thị

ảnh ra cửa sổ đã được tạo trước đó

Hàm waitKey(int delay) sẽ đợi cho đến khi có một phím được bấm vào trong

khoảng thời gian delay Ta dùng hàm này mục đích là để dừng màn hình lạitrong một khoảng thời gian bằng tham số delay (tính theo đơn vị ms) Nếumuốn dừng lại màn hình mãi ta đặt tham số delay bằng 0

2.3 Điều chỉnh độ sáng và độ tương phản trong ảnh

Một điểm ảnh được lưu trữ trên máy tính là một ma trận các điểm ảnh (hay

pixel) Trong OpenCV nó được biểu diễn dưới dạng cv::Mat Ta xét một kiểu

ảnh thông thường nhất, đó là ảnh RGB Với ảnh này, mỗi pixel ảnh quan sát

Trang 24

được là sự kết hợp của các thành phần màu R (Red), G (Green), B (Blue) Sự kết hợp này theo tỉ lệ R, G, B khác nhau sẽ tạo ra vô số các màu sắc khác nhau Giả sử ảnh được mã hóa bằng 8 bit với từng kênh màu, khi đó mỗi giá trị của R, G, B sẽ nằm trong khoảng [0, 255] Như vậy, ta có thể biểu diễn tới 255*255*255 ~ 1,6 triệu màu từ ba màu cơ bản trên Ta có thể xem cách biểu

diễn ảnh trong OpenCV ở định dạng cv::Mat qua hình ảnh sau:

Như vậy, mỗi ảnh sẽ có n hàng và m cột, m được gọi là chiều dài của ảnh, nđược gọi là chiều cao của ảnh Mỗi pixel ở vị trí (i, j) trong ảnh sẽ tương ứngvới 3 kênh màu kết hợp trong nó Để truy xuất tới từng pixel ảnh với nhữngkênh màu riêng ta sẽ sử dụng mẫu sau:

img.at<cv::Vec3b>(i, j)[k]

Trong đó, i, j là pixel ở hàng thứ i và cột thứ j, img là ảnh mà ta cần truy xuất

tới các pixel của nó Cv::Vec3b là kiểu vector uchar 3 thành phần, dùng để

biểu thị 3 kênh màu tương ứng k là kênh màu thứ k, k= 0,1,2,… tương ứngvới kênh màu B, G, R Chú ý là trong OpenCV, hệ màu RGB được biểu diễntheo thứ tự chữ cái là BGR

Sau đây ta sẽ áp dụng kiến thức trên để làm tăng, giảm độ sáng và tương phảncủa một ảnh màu, việc làm này cũng hoàn toàn tương tự đối với ảnh xám, chỉkhác biệt là ảnh ta dùng một kênh duy nhất để biểu diễn ảnh xám

Giả sử f là một hàm biểu diễn cho một ảnh nào đó, f(x,y) là giá trị của pixel

trong ảnh vị trí (x,y) Đặt g(x,y) = αf(x,y) + β.f(x,y) + β Khi đó, nếu , thì ta nói ảnh g(x,y) có độ tương phản gấp lần so với ảnh f(x,y Nếu ta nói độ sáng của

Trang 25

ảnh g(x,y) đã thay đổi một lượng là Dựa vào công thức trên ta có chương

trình thay đổi độ sáng và tương phản của ảnh như sau:

Trong chương trình trên, hàm clone() sẽ sao chép một ảnh giống hệt như ảnh gốc cho vào ảnh đích (drt = src.clone()) Giá trị của các pixel

ảnh f(x,y) và g(x,y) ở đây phải nằm trong khoảng [0,255], trong khi phép biến đổi g(x,y) = αf(x,y) + β.f(x,y) + β có thể khiến cho giá trị g(x,y) vượt qua ngưỡng đó Để

tránh tình trạng tràn số hoặc kiểu dữ liệu không tương thích, ta dùng thêm

hàm saturate_cast<uchar>(type) Hàm này sẽ biến kiểu dữ liệu type nếu

không phải là uchar thành kiểu dữ liệu uchar.

Sau đây là kết quả với α = 2.0 và β = 30

Trang 26

Phóng to, thunhỏ và xoay ảnh

2.4 Phóng to, thu nhỏ và xoay ảnh

Ảnh số thực chất là một ma trận các điểm ảnh, do đó để có thể phóng to, thunhỏ hay xoay một tấm ảnh ta có thể sử dụng các thuật toán tương ứng trên matrận

Ta sẽ sử dụng biến đổi affine để quay và thay đổi tỉ lệ to, nhỏ của một ma

trận

Biến đối affine

Giả sử ta có vector và ma trận M có kích thước 2x2 Phép biến

đổi affine trong không gian hai chiều được định nghĩa p’ = Mp, trong

Trang 27

Nếu δy, y' = = γx +, khi đó x' = αx và y' = βy, phép biến đổi này làm thay đổi tỉ lệ của

ma trận Nếu là trong ảnh nó sẽ phóng to hoặc thu nhỏ ảnh Hình sau mô tảphép biến đổi với tỉ lệ α = β = 2

Nếu ta định nghĩa ma trận

thì phép biến đổi sẽ vừa là phép biến đổi theo tỉ lệ và quay

Bây giờ ta sẽ xét chương trình phóng to, thu nhỏ và quay ảnh

Trang 28

Trong chương trình trên, hàm cv::getRotationMatrix2D(cv::Point center, double angle, double scale) sẽ tạo ra ma trận với tâm quay center, góc quay angle và tỉ lệ scale Ma trận này được tính toán trong OpenCV là ma

trận như sau:

với α = scale.cos(angle) và β = scale.sin(angle)

Ta thấy rằng ma trận này là hoàn toàn tương đương với ma trận của phép biếnđổi affine đã nói ở trên, ngoại trừ thành phần thứ 3 là thành phần giúp dịchchuyển tâm quay vào chính giữa của bức ảnh Chú ý là có sự khác biệt mộtchút về chiều của hệ tọa độ trong ảnh, hệ tọa độ trong ảnh lấy góc trên bêntrái làm gốc tọa độ (0,0) còn hệ tọa độ thông thường ta hay lấy điểm dưới bêntrái làm gốc, do đó có sự ngược chiều

Kết quả của chương trình trên với tỉ lệ scale = 1.5 và góc quay = 45 độ:

Ngoài hai phép biến đổi là tỉ lệ và quay như trên, ta có thể thực hiện các biến

đổi khác của phép biến đổi affine như phép trượt (shearing), hoặc phép phản

chiểu (reflection) bằng việc định nghĩa lại ma trận M Ta thử định nghĩa lại

ma trận M để được một ảnh trượt của ảnh gốc Quay lại ma trận M như trên,nếu ta định nghĩa α = β = 1 còn δy, y' = nhận một giá trị bất kì, khi đó ta sẽ có:

Trang 29

ta sẽ định nghĩa ma trận để trượt ảnh ban đầu thànhảnh mới với hệ số mượt δy, y' = = 0.5, chú ý là thành phần thứ ba

định nghĩa ma trận trong OpenCV sẽ thể hiện độ dịch chuyển, giống nhưtrong ví dụ trên ta chuyển tâm quay về tâm của bức ảnh chẳng hạn Ta sẽ làmgiống hệt ví dụ trên, chỉ thay ma trận M là ma trận ta tự định nghĩa

double I[2][3] = {1, 0.5, 0, 0, 1, 0};

Mat mat_rot(2, 3, CV_64F, I);

warpAffine(src, dst, mat_rot, src.size());

Trang 30

Và ta có kết quả:

Trang 31

dữ liệu tự động dựa trên nguyên tắc: đặt cho đối tượng cần quản lý mộtdãy số (hoặc dãy chữ và số), sau đó thể hiện dưới dạng mã vạch để máyquét có thể đọc được Trong quản lý hàng hóa người ta gọi dãy số và dãyvạch đó là mã số mã vạch của hàng hóa.

Mã số mã vạch đầu tiên được chế tạo và đưa vào sử dụng trên thế giới từnhững năm thập kỷ 70 của thế kỷ 20 Do yêu cầu phát triển sản xuất vàkinh doanh thương mại, công nghệ mã số mã vạch ngày càng được nghiêncứu hoàn thiện, phát triển và được dụng rộng rãi trong đa ngành kinh tế vàtrên toàn thế giới

Năm 1973 tổ chức MSMV đầu tiên được thành lập, đó là Hội đồng mã thống nhất của Mỹ (viết tắt tên tiếng Anh là UCC)

Năm 1977, Hội mã số vật phẩm Châu âu (EAN) ra đời do sáng kiến của

12 nước Châu Âu, đến năm 1984 đổi thành EAN International, là một tổchức phi lợi nhuận, hoạt động trên cơ sở trung lập với mục đích chính làđẩy mạnh áp dụng hệ thống EAN trên toàn cầu trong tất cả các ngànhkinh tế - xã hội nhằm cung cấp ngôn ngữ chung cho thương mại quốc tế(đặc biệt là thương mại điện tử .)

Từ năm 2005, hai tổ chức EAN International và UCC hợp nhất thành mộttổ chức phân định toàn cầu có tên là GS1

Trang 32

I.2 Mã vạch là gì?

Mã số hàng hóa( Article Number Code) là dãy chữ số nguyên, trong đó có cácnhóm số để biết được xuất xứ của hàng hóa, một nhóm số để biết được doanh nghiệp sản xuất, một nhóm số thể hiện loại hàng hóa, và một nhóm số thể hiện số kiểm tra hàng hóa

Một mã số hàng hóa có 2 tính chất cơ bản:

+ Con số duy nhất đặc trưng cho hàng hóa, mỗi loại hàng hóa được nhận diện bởi 1 dãy số duy nhất và ngược lại mỗi dãy số chỉ tương ứng với một loại hàng hóa

+ Mã số chỉ là dãy số đại diện cho hàng hóa chứ không liên quan đến đặc điểm hay chất lượng của hàng hóa, trên mã số cũng không có giá của hàng hóa mà giá của hàng hóa chỉ được nhà cung cấp lưu lại trên hệ thống của cửa hàng

Mã vạch hàng hóa (Barcode) là hình ảnh tập hợp ký hiệu các vạch đen trắng, đậm, nhạt, dài, ngắn, thành nhóm vạch và định dạng khác nhau để cá máy đọcđầu gắn laser hoặc camera ghi nhận hình ảnh có thể đọc được các ký hiệu này

I.3 Phân loại mã vạch

Mã số mã vạch gồm nhiều loại khác nhau, tùy theo dung lượng thông tin, dạng thông tin đuộc mã hóa cũng như mục đích sử dụng mà người ta chia làmnhiều loại Hiện nay trong nền thương mại thế giới người ta chủ yếu áp dụng

2 loại mã vạch

- Mã vạch UPC (Universal Product Code)

UPC là một loại ký hiệu mã số được ngành công nghiệp thực phẩm ứng dụng vào năm 1973 và thuộc quyền quản lý của Hội đồng mã thống nhất Mỹ UCC (Uniform Code Council, Inc.) Mã UPC gồm 2 thành phần chính: phần mã

Trang 33

gồm 12 ký số, không bao gồm ký tự Mã UPC vẫn còn đang sử dụng ở Hoa

Kỳ và Bắc Mỹ

Hình 2-1: Ví dụ mã vạch UPC

- Mã vạch EAN (European Article Number)

EAN là bước phát triển kế tiếp của UPC Hệ thống mã EAN được thiết lập bởi các nhà sáng lập là 12 nước châu Âu được sử dụng từ năm 1974

và sau đó phát triển nhanh chóng và được sử dụng hầu hết tại các nước trên thế giới Chính vì vậy từ năm 1977, EAN trở thành một tổ chức quốc

tế với tên gọi EAN quốc tế (EAN International) Mã vạch EAN gồm các vạch tối và sáng (khoảng trắng) được tạo bởi các modun có độ rộng, độ sáng hoặc độ tối thống nhất

Mã vạch EAN, mỗi số được thể hiện bằng 7 modun gồm các vạch thể hiện số và các vạch phụ cấu tạo từ một số modun nhất định: vạch giữa, 2 vạch biên và mã vạch

Mỗi giá trị số được thể hiện trong mã vạch bằng 7 modun theo 3 bộ mã A,B,C như trong bảng sau:

Trang 34

Bảng 2-1: Giá trị số 0-9 theo bộ mã A,B,C

Kích thước danh định của mã vạch EAN:

Theo kích thước chuẩn độ rộng của mỗi modun là 0.33mm NHư vậy kích thước cụ thể của các loại mã vạch:

Mỗi chữ số : 7 modun = 2.31 mm

Vạch biên: 3 modun = 0.99 mm

Vạch giữa: 5 modun = 1.65 mm

Trong hệ thống mã số EAN cho sản phẩm bán lẻ thường có hai loại, một loại

sử dụng 13 con số (EAN-13) và loại kia sử dụng 8 con số (EAN-8)

Mã số EAN-13 gồm 13 con số, từ trái sang phải:

Trang 35

+ Mã quốc gia gồm 2 hoặc 3 con số đầu

+Mã doanh nghiệp gồm từ 4,5 hoặc 6 con số do tổ chức mã số vật phẩm quốc gai cấp cho các nhà sản xuất là thành viên của họ

+ Mã mặt hàng có thể là 5, 4 hoặc 3 con số tùy thuộc vào mã doanh nghiệp,

Mã này do nhà sản xuất quy định, đảm bảo mỗi sản phầm chỉ có một mã số.+ Mã kiểm tra là số cuối cùng của dãy mã số, được tính dựa vào 12 con số trước đó, dùng để kiểm tra việc ghi đúng những con số nói trên

Bước 3: Cộng giá trị của các con số sòn lại

Bước 4: Cộng kết quả bước 2 với bước 3

Bước 5: Lấy bội số của 10 lớn hơn và gần kết quả bước 4 nhất trù đi kết quả bước 4 được số kiểm tra C

Trang 36

Tương tự như EAN-13, mã EAN-8 cũng có quy định về cấu tạo mã vạch như sau:

+ Mã quốc gia gồm 3 con số đầu

+ Mã mặt hàng gồm 4 con số tiếp theo

+Mã kiểm tra là con số cuối cùng

Cách tính số kiểm tra C cũng giống cách tính mã EAN-13

I.4 Cấu tạo của mã vạch

Một hệ thống mã vạch như thế này có ba phần chính Thứ nhất, có một máy tính trung tâm chạy hệ thống cơ sở dữ liệu (hệ thống lưu trữ) giữ được số lượng của tất cả các sản phẩm mà bạn đang bán, ai làm ra nó, mỗi thứ có giá bao nhiêu và bạn có bao nhiêu trong kho Thứ hai, có các mã vạch được in trên tất cả các sản phẩm Cuối cùng, có một hoặc nhiều máy quét checkout có thể đọc các mã vạchKhi nhìn vào mã vạch thoạt đầu ta không thể phân biệt được đâu là phần bắt đầu và đâu là phần kết thúc của mã vạch, nhưng thật ra rất đơn giản Mỗi chữ số trong số sản phẩm được cho cùng một khoảng khôngngang chính xác 7 đơn vị Các thanh ngang này được tô màu đen hoặc trắng

để biểu thị số thập phân 0-9 Mỗi khối đã được thiết kế sao cho, ngay cả khi bạn lật ngược nó, nó không thể bị lẫn lộn với bất kỳ cái nào khác

Trang 37

Hình 2-3: quy tắc mã vạch của số 0 - 9

Mã số mã vạch được thu nhận bằng một máy quét mã vạch, một máy thu nhận hình ảnh của mã vạch in trên các bề mặt và chuyển thông tin chứa trong mã vạch đến máy tính hay các thiết bị cần thông tin này và mã vạch được giải mã thành dãy số một cách tự động, gọi ra tiệp dữ liệu liên quan đến hàng hoá đang lưu trữ trong cơ sở dữ liệu về sản phẩm hàng hóa

I.5 Chương trình phát hiện và giải mã mã vạch sử dụng thư viện

OPENCV và ZBAR

- Đầu tiên chúng ta sẽ xác định một chuỗi để chứa thông tin về mã

vạch hoặc mã QR được phát hiện trong một hình ảnh

- Tiếp theo chúng ta xây dựng một hàm giải mã có trong một hình

ảnh và trả về tất cả các mã vạch và mã QR được tìm thấy

Trang 38

 Đầu tiên trong các dòng từ 20-23 chúng ta tạo một máy quét bằng cách

sử dụng lệnh trong thư viện ZBAR và cấu hình cho nó để phát hiện tất

cả các loại mã vạch và mã QR Nếu bạn chỉ muốn phát hiện một loại định dạng mã cụ thể thì chúng ta cần thay đổi ZBAR_NONE sang một loại bất kỳ trong mã nguồn của thư viện Sau đó, chúng ta chuyển hình ảnh sang thang độ xám (từ dòng 25-27) Sau đó chuyển đổi hình ảnh từ thang độ xám sang định dạng tương thích ZBAR ở dòng 30 Cuối cùng chúng ta quét hình ảnh để tìm ký hiệu (dòng 33) Cuối cùng, chúng ta lặp lại các ký hiệu và trích xuất loại, dữ liệu, thông tin vị trí và đẩy nó vào vector của đối tượng được phát hiện ( từ dòng 35 - 53 )

Trang 39

- Tiếp theo chúng ta sẽ giải thích hàm hiển thị tất cả các ký hiệu

Đoạn mã trên đây lấy ảnh đầu vào và một vector các ký hiệu được giải mã từ bước trước Nếu các điểm tạo thành một tứ giác (ví dụ trong mã QR), chúng ta chỉ cần vẽ tứ giác (dòng 73) Nếu vị trí không phải là một tứ giác thì chúng ta sẽ vẽ đường biên bên ngoài của tất cả các điểm (còn gọi là vỏ lồi) của tất cả các điểm Điều này được thực hiện bằng cách sử dụng hàm trong thư viện OPENCV có tên là convexHull ở dòng số 71

Trang 40

- Cuối cùng chúng ta có chương trình chính như trên ảnh đơn giản là

đọc một hình ảnh, giải mã các ký hiệu bằng hàm giải mã được mô tả

ở trên và hiển thị vị trí trên ảnh bằng hàm hiển thị cũng được mô tả bên trên

I.6 Hình ảnh chương trình khi chạy và cho ra kết quả

- Hình ảnh đã được phát hiện và xử lý:

Ngày đăng: 02/09/2022, 08:09

TỪ KHÓA LIÊN QUAN

w