Professional Documents
Culture Documents
Báo Cáo Môn Học Trang Bị Điện
Báo Cáo Môn Học Trang Bị Điện
Hiện nay, công nghệ xử lý ảnh đã rất phổ biến trong công nghiệp, được ứng
dụng vào trong thực tế sản xuất. Và với những Camera thông dụng đủ tốt nhưng
không quá đắt tiền nếu chúng ta xây dựng một phần mềm chương trình nhận dạng
bằng Camera thì sẽ tiết kiệm được giá thành hơn khi mua máy đọc mã vạch. Hơn
nữa với Camera thì chúng ta có thể sử dụng trong các mục đích khác ngoài việc
đọc mã vạch. Đó là ưu điểm rất lớn và vượt trội của xử lý ảnh trong công nghiệp.
Vì vậy, em muốn đi vào nghiên cứu và viết một chương trình nhận dạng mã
vạch ứng dụng công nghệ xử lý ảnh, và đã chọn đề tài: “Ứng dụng công nghệ xử
lý ảnh để nhận dạng mã vạch”.
Mục đích của đề tài nhằm xây dựng môt chương trình để đọc mã vạch từ
Camera, từ đó có thể phát triển để ứng dụng vào các yêu cầu đọc mã vạch thực
tế như thư viện, nhà sách, siêu thị …
1
1.4 Phương pháp nghiên cứu
Dựa trên yêu cầu của đề tài em đã thu thập tài liệu về mã vạch và cách giải
mã mã vạch, tìm hiểu về các máy đọc mã vạch thực tế để ứng dụng vào việc
thiết kế phần mềm đọc mã vạch.
Sau khi nghiên cứu về mã vạch, em tìm hiểu về lý thuyết xử lý ảnh, chủ yếu
đi về các thuật toán tăng cường chất lượng ảnh để Camera nhận dạng tốt hơn.
Và cuối cùng là việc viết chương tình nhận dạng mã vạch từ dữ liệu hình
ảnh Camera thu về.
2
CHƯƠNG 2: TỔNG QUAN VÀ CÁC VẤN ĐỀ LIÊN
QUAN
2.1 Xử lý ảnh và các vấn đề cơ bản trong xử lý ảnh
Con người thu nhận thông tin qua các giác quan, trong đó thị giác đóng vai
trò quan trọng nhất. Những năm trở lại đây với sự phát triển của phần cứng
máy tính, xử lý ảnh và đồ họa đó phát triển một cách mạnh mẽ và có nhiều
ứng dụng trong cuộc sống. Xử lý ảnh và đồ họa đóng một vai trò quan trọng
trong tương tác người – máy.
Quá trình xử lý ảnh được xem như là quá trình thao tác ảnh đầu vào nhằm
cho ra kết quả mong muốn. Kết quả đầu ra của một quá trình xử lý ảnh có thể
là một ảnh “tốt hơn” hoặc một kết luận.
3
Nội dung của mã vạch là thông tin về sản phẩm như: nước sản xuất, tên
doanh nghiệp, lô, tiêu chuẩn chất lượng đăng ký, thông tin về kích thước sản
phẩm, nơi kiểm tra …
4
Mã vạch cụm
Micro PDF417
Mã vạch 2D
5
hoặc nhiều màu.
EAN là bước phát triển kế tiếp của UPC. Về cách mã hóa nó cũng giống
hệt như UPC nhưng về dung lượng nó gồm 13 ký số trong đó 2 hoặc 3 ký số
đầu tiên là ký số “mốc”, dùng để biểu thị cho nước xuất xứ. Các ký số này
chính là “mã quốc gia” của sản phẩm được cấp bởi Tổ chức EAN quốc tế
(EAN International Organization)
EAN này được gọi là EAN-13 để phân biệt với phiên bản EAN-8 sau này
gồm 8 ký số.
Theo ký hiệu EAN-13 như hình vẽ phía trên, có thể phân chia như sau:
* 893 – Mã quốc gia Việt Nam
* 123456789 – 9 ký số này được phân chia làm 2 cụm: cụm mã nhà sản
xuất có thể 4, 5 hoặc 6 ký số tùy theo được cấp, cụm còn lại là mã mặt hàng.
* 7 – Mã kiểm tra tính chính xác của tòan bộ số EAN.
6
Code 39
Code 39 được phát triển sau UPC và EAN là ký hiệu chữ và số thông
dụng nhất. Nó không có chiều dài cố định như UPC và EAN do đó có thể
lưu trữ nhiều lượng thông tin hơn bên trong nó. Do tính linh họat như vậy,
Code 39 được ưa chuộng rộng rãi trong bán lẻ và sản xuất. Bộ ký tự này bao
gồm tất cả các chữ hoa, các ký số từ 0 đến 9 và 7 ký tự đặc biệt khác.
Nhiều tổ chức đã chọn một dạng thức Code 39 để làm chuẩn công nghiệp
của mình trong đó đáng chú ý là Bộ Quốc Phòng Mỹ đã lấy Code 39 làm bộ
mã gọi là LOGMARS.
Mã QR Code
7
Mã ma trận – Data Matrix
Mã Data Matrix được ứng dụng trong việc đặt tên các hàng hóa và văn
bản. Tương tự như QR Code, loại mã vạch này hầu như rất ít bị lỗi trong quá
trính sử dụng, khả năng đọc nhanh...Mã AZTEC
Mã vạch PDF417
PDF417 là một loại mã vạch 2 chiều 2D, chúng được dùng trong các ứng
dụng yêu cầu lưu trữ lượng dữ liệu khổng lồ, có thể kể đến như: Ảnh kỹ
thuật số, dấu vân tay, số và đồ họa, chữ ký,...
Mã vạch PDF417 là một loại mã vạch thông dụng ở nước ngoài và được sử
dụng miễn phí.
8
CHƯƠNG 3:
TỔNG QUAN VỀ NGÔN NGỮ Python-OpenCV VÀ
PHẦN MỀM GIAO DIỆN GUI
3.1 Tổng quan ngôn ngữ Python
3.1.1 Python là gì ?
9
Python là một ngôn ngữ lập trình thông dịch, hướng đối tượng, ngôn
ngữ lập trình cấp cao được giải thích với ngữ nghĩa động. Python với triết lý
thiết kế của nó rất thuận tiện cho việc đọc hiểu code, đơn giản và rõ ràng
được thiết kế bởi Guido van Rossum. Thiết kế bắt đầu vào cuối những năm
1980 và được phát hành lần đầu tiên vào tháng 2 năm 1991. Đến nay thì
cộng đồng người sử dụng ngôn ngữ này rất đông, nếu so sánh từ bảng xếp
hạng các ngôn ngữ năm 2018 thì Python đã leo lên vị trí số 1 trên bảng xếp
hạng những ngôn ngữ lập trình phổ biến.
3.1.2Đặc điểm của Python
Cú pháp rất tường minh, dễ đọc.
Các khả năng tự xét mạnh mẽ.
Hướng đối tượng trực giác.
Cách thể hiện tự nhiên mã thủ tục.
Hoàn toàn mô-đun hóa, hỗ trợ các gói theo cấp bậc.
Xử lý lỗi dựa theo ngoại lệ.
Kiểu dữ liệu động ở mức rất cao.
Các thư viện chuẩn và các mô-đun ngoài bao quát hầu như mọi việc.
Phần mở rộng và mô-đun dễ dàng viết trong C, C++.
Có thể nhúng trong ứng dụng như một giao diện kịch bản (scripting
interface).
Python mạnh mẽ và thực hiện rất nhanh.
3.2 Tổng quan về OpenCV
3.2.1 OpenCV là gì ?
OpenCV (Open Computer Vision) là một thư viện mã nguồn mở hàng
đầu cho xử lý về thị giác máy tính, machine learning, xử lý ảnh. OpenCV
đươc viết bằng C/C++, vì vậy có tốc độ tính toán rất nhanh, có thể sử dụng
10
với các ứng dụng liên quan đến thời gian thực. Opencv có các interface cho
C/C++, Python Java vì vậy hỗ trợ được cho Window, Linux, MacOs lẫn
Android, iOS OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng
download vượt quá 6 triệu lần.
3.2.2 Ứng dụng
Opencv có rất nhiều ứng dụng:
Nhận dạng ảnh
Xử lý hình ảnh
Phục hồi hình ảnh/video
Thực tế ảo
Các ứng dụng khác
11
3.3.2 PyQt5 là gì ?
Qt là một Application framework đa nền tảng viết trên ngôn ngữ C++ ,
được dùng để phát triển các ứng dụng trên desktop, hệ thống nhúng và
mobile. Hỗ trợ cho các platform bao gồm : Linux, OS X, Windows,
VxWorks, QNX, Android, iOS, BlackBerry, Sailfish OS và một số
platform khác. PyQt là Python interface của Qt, kết hợp của ngôn ngữ lập
trình Python và thư viện Qt, là một thư viện bao gồm các thành phần giao
diện điều khiển (widgets , graphical control elements).
PyQt API bao gồm các module bao gồm số lượng lớn với
các classes và functions hỗ trợ cho việc thiết kế ra các giao diện giao tiếp
với người dùng của các phần mềm chức năng. Hỗ trợ với Python 2.x và
3.x.
Các class của PyQt5 được chia thành các module, bao gồm:
+ QtCore : là module bao gồm phần lõi không thuộc chức năng GUI, ví
dụ dùng để làm việc với thời gian, file và thư mục, các loại dữ liệu,
streams, URLs, mime type, threads hoặc processes.
+ QtGui : bao gồm các class dùng cho việc lập trình giao diện
(windowing system integration), event handling, 2D graphics, basic
imaging, fonts và text.
+ QtWidgets : bao gồm các class cho widget, ví dụ : button, hộp thoại, …
được sử dụng để tạo nên giao diện người dùng cơ bản nhất.
+ QtMultimedia : thư viện cho việc sử dụng âm thanh, hình ảnh, camera,
…
12
+ QtBluetooth : bao gồm các class giúp tìm kiếm và kết nối với các thiết
bị có giao tiếp với phần mềm.
+ QtNetwork : bao gồm các class dùng cho việc lập trình mạng, hỗ trợ
lập trình TCP/IP và UDP client , server hỗ trợ việc lập trình mạng.
+ QtPositioning : bao gồm các class giúp việc hỗ trợ xác định vị.
+ Enginio : module giúp các client truy cập các Cloud Services của Qt.
+ QtWebSockets : cung cấp các công cụ cho WebSocket protocol.
+ QtWebKit : cung cấp các class dùng cho làm việc với các trình duyệt
Web , dựa trên thư viện WebKit2.
+ QtWebKitWidgets : các widget cho WebKit.
+ QtXml : các class dùng cho làm việc với XML file.
+ QtSvg : dùng cho hiển thị các thành phần của SVG file.
+ QtSql : cung cấp các class dùng cho việc làm việc với dữ liệu.
+ QtTest : cung cấp các công cụ cho phép test các đơn vị của ứng dụng
với PyQt5.
13
Bằng cách kéo thả các đối tượng như Button, text box, group box, check
box… ta được giao diện như trên.
Sau khi tạo xong được giao diện, phần mềm sẽ xuất cho ta một file
“design.ui”.Nhiệm vụ của ta bây giờ là sẽ chuyển đổi file có đuôi “.ui”
sang file có đuôi “.py” để nhúng code xử lý quét mã vạch. Sau đây là câu
lệnh chuyển đổi trên terminal:
Pyuic5-x design.ui -o design.py
14
FILE_NAME: Là tên file sẽ code
Trong quá trình nghiên cứu và phân tích các ưu nhược điểm của các loại thuật
toán đọc mã vạch khác nhau, ta thấy thuật toán DBR có các chức năng đọc mã
vạch trong các ướng dụng đa nền tảng. Các định dạng mã vạch được hỗ trợ bao
gồm QR Code, Linear(1D), PDF 417, DataMatrix …
15
4.3 Một số hàm xử lý mã vạch.
Hàm đọc mã vạch từ hình ảnh đơn hoặc tệp hình ảnh
def __decode_file(self, filename):
self.__init_params()
#Lấy các thiết lập hiện tại và lưu vào đối tượng settings
settings = self._reader.get_runtime_settings()
#Cài đặt kết quả hiển thị là hình ảnh gốc
settings.intermediate_result_types = EnumIntermediateResultType.IRT_ORIGINAL_IMAGE
#Chỉ định lưu kết quả trong bộ nhớ
16
settings.intermediate_result_saving_mode = EnumIntermediateResultSavingMode.IRSM_MEMORY
#Cập nhật các cài đặt hiện tại, nếu có lỗi thì báo lỗi
error = self._reader.update_runtime_settings(settings)
#Lấy thời gian bắt dầu xử lý
start = time.time()
#Đọc tên file
results = self._reader.decode_file(filename)
end = time.time()
#trả về các kết quả trung gian có chứa hình ảnh gốc, ảnh cụm màu, Hình ảnh binarized, đường viền,...
intermediate_results = self._reader.get_all_intermediate_results()
#Lấy tất cả các thuộc tính của ảnh
imageData = intermediate_results[0].results[0]
buffer = imageData.bytes
width = imageData.width
height = imageData.height
stride = imageData.stride
format = imageData.image_pixel_format
channel = 3
while True:
results = None
try:
frame = frameQueue.get(False, 10)
if type(frame) is str:
break
except:
time.sleep(0.01)
continue
start, end = 0, 0
try:
17
#Lấy thông số khung hình
frameHeight, frameWidth, channel = frame.shape[:3]
start = time.time()
# results = reader.decode_buffer(frame)
#Giải mã mã vạch từ đầu vào video và trả về các kết quả dưới dạng văn bản Results
results = reader.decode_buffer_manually(np.array(frame).tobytes(), frameWidth, frameHeight,
frame.strides[0], EnumImagePixelFormat.IPF_RGB_888)
end = time.time()
except BarcodeReaderError as error:
print(error)
try:
#trả về kết quả và thời gian xử lý
resultQueue.put([results, (end - start) * 1000], False, 10)
except:
pass
18
CHƯƠNG 5: KẾT QUẢ THỰC HIỆN
5.1 Kết quả nhận diện từ ảnh
19
5.2 Kết quả nhận diện từ video
20
CHƯƠNG 6: KẾT LUẬN
- Bài tập lớn “ỨNG DỤNG CÔNG NGHỆ XỬ LÝ ẢNH ĐỂ NHẬN DẠNG
MÃ VẠCH” của em đã xử lí nhận dạng và giải mã mã vạch từ hình ảnh hoặc
video đầu vào.
- Đối với thu nhận ảnh từ camera thì độ chính xác còn chưa cao do bị tác động
bởi các yếu tố môi trường như ánh sáng , bụi bẩn hay chất lượng của camera…
- Để giải quyết các khó khăn của đề tài, người thực hiện xin đề xuất 1 số ý kiến
sau đây:
+ Sử dụng camera chuyên dụng.
+ Thiết lập môi trường ổn định xung quanh để làm tăng độ chính xác của ảnh
chụp ( xác định 1 vị trí cố định để chụp ảnh).
+ Thu thập nhiều mẫu ký tự để tăng tập mẫu qua đó tăng độ chính xác của
chương trình.
+ Tìm hiểu thêm nhiều kiến thức để cải thiện đề tài 1 cách tối ưu và tốt hơn…
21