Tải bản đầy đủ (.pdf) (20 trang)

báo cáo bài tập lớn môn kỹ thuật lập trình c c đề tài xuất dữ liệu từ ảnh thẻ sinh viên

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.14 MB, 20 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC BÁCH KHOA HÀ NỘITRƯỜNG ĐIỆN – ĐIỆN TỬ</b>

<b>- - -   </b>

<b>-BÁO CÁO BÀI TẬP LỚN</b>

<b>MƠN KỸ THUẬT LẬP TRÌNH C/C++</b>

<i><b>Đề tài: Xuất dữ liệu từ ảnh thẻ sinh viên</b></i>

<b> Lớp : Điện tử 010 – K63 Mã lớp học : 133362</b>

<i><b>Hà Nội, 8/2022</b></i>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Hiện nay, nhu cầu về việc rút trích từ ngữ từ hình ảnh đang ngày càng pháttriển, bên cạnh sự gia tăng về nhu cầu là sự phát triển của công nghệ nhận dạng kýtự quang học (Optical Character Recognition) hay còn được gọi tắt là OCR. Đây làmột cơng nghệ giúp chuyển đổi hình ảnh của chữ viết tay hoặc đánh máy thành cácký tự đã được mã hóa trong máy tính. Chẳng hạn như chúng ta cần trích xuất thơngtin các nhân trên thẻ căn cước cơng dân hoặc thẻ sinh viên, …

Trích xuất thơng tin từ ảnh Thẻ sinh viên giúp cho nhiều ứng dụng cần dùngxác minh sinh viên được thuận lợi hơn chính xác hơn. Mục tiêu đề tài là nghiên cứucác giải thuật xử lý ảnh, thư viện lập trình OpenCV kết hợp với bộ ký tự Tesseractvà luyện tập khả năng lập trình ngơn ngữ C/C++ để trích xuất thơng tin từ file ảnhchuyển sang dạng text.

Cảm ơn tới TS Nguyễn Quang Minh đã tạo điều kiện cho chúng em có thểtrình bày bài tập này để có cơ hội được tìm hiểu và nâng cao kỹ năng lập trình C/C++ cũng như về lĩnh vực xử lý ảnh.

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>1. Tổng quan về ngôn ngữ lập trình C++</b>

Ngơn ngữ lập trình C++ được phát triển năm 1980 bởi <b>Bjarne Stroustrup tại</b>

phịng thí nghiệm Bell của AT&T ((American Telephone & Telegraph)), Mỹ. Nóđược phát triển bằng cách bổ sung thêm tính năng OOP (Object OrientedProgramming - Lập trình hướng đối tượng) vào C mà không thay đổi quá lớn tớicác thành phần của C.

C++ là ngơn ngữ lập trình bậc trung bởi nó mang tính chất của cả ngơn ngữbậc cao (tính trừu tượng) và ngôn ngữ bậc thấp (liên quan chặt chẽ đến ngơn ngữmáy). C++ cung cấp mơ hình bộ nhớ và tính tốn cho hầu hết các máy tính. Mởrộng từ ngơn ngữ C, C++ mang những tính chất tối ưu hơn như tính hướng đốitượng (Object Oriented Programming) nhằm cung cấp cơ chế mạnh mẽ và linh hoạthơn để trương tượng hóa vấn đề cần giải quyết. Điều này cho phép người sử dụngtạo ra và dùng các đối tượng phù hợp với các khái niệm của ứng dụng đó, do đó C++ cung cấp kiểu lập trình thao tác trực tiếp tài nguyên phần cứng và mô hình dữ liệugần với quan điểm người hơn so với tác vụ của máy tính.

- Ngơn ngữ lập trình C++ có thể được dùng để làm những cơng việc sau: 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++ được dùng để tạo nên các game lớn của hãng Blizzard (World ofWarcraft, Diablo series, StarCraft series…). Gần như toàn bộ các game bomtấn trên thị trường hiện nay cũng dùng C++ để phát triển. Một số cơng cụ sửdụng trong việc lập trình game có sử dụng C++ như Unreal engine, Cocos2d-x framework,… Các ông lớn trong ngành công nghiệp game như Valve,CryTek cũng sử dụng C++.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

 Thao tác vào ra trong C++ :

Thao tác <b>vào ra dữ liệu</b> trong C++ sử dụng khái niệm luồng (stream). Luồnglà một chuỗi các bytes hoặc đường đi của dữ liệu. Nó khiến hiệu suất thực hiện caohơn. C++ hỗ trợ thư viện <i><b><iostream></b></i> để sử dụng chức năng <i><b>cin </b></i>và <i><b>cout</b></i>.

Kiểu dữ liệu trong C++

- C++ hỗ trợ lưu trữ và thao tác trên 4 loại kiểu dữ liệu:

o Kiểu dữ liệu cơ bản : int (integer) và float.o Kiểu dữ liệu Enum: kiểu dữ liệu dạng liệt kê.

o Kiểu dữ liệu Void: khơng trả lại giá trị gì (thường dùng để tạo hàm).o Kiểu dữ liệu nâng cao: con trỏ, mảng, structure, union, function…- Tính chất OOP trong C++ : cũng như các các ngôn ngữ bậc cao, OOP trongC++ có 4 tính chất cơ bản:

o Tính trừu tượngo Tính đa hìnho Tính kế thừao Tính đóng gói

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>2. Tổng quan về xử lý ảnh</b>

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à đồ hoạ đó phát triển một cách mạnh mẽ và có nhiều ứng dụng trongcuộc sống. Xử lý ảnh và đồ hoạ đóng một vai trị quan trọng trong tương tác ngườimáy. Quá trình xử lý ảnh được xem như là quá trình thao tác ảnh đầu vào nhằm chora kết quả mong muốn. Kết quả đầu ra của một quá trình xử lý ảnh là ảnh phù hợpvới nhu cầu của người lập trình.

Ảnh có thể xem là tập hợp các điểm ảnh và mỗi điểm ảnh được xem như là đặctrưng cường độ sáng hay một dấu hiệu nào đó tại một vị trí nào đó của đối tượngtrong khơng gian và nó có thể xem như một hàm n biến P(c1, c2,..., cn). Do đó, ảnhtrong xử lý ảnh có thể xem như ảnh n chiều.

Sơ đồ tổng quát của một hệ thống xử lý ảnh:

Các vấn đề cơ bản trong xử lý ảnh: Ảnh và điểm ảnh:

Điểm ảnh được xem như là dấu hiệu hay cường độ sáng tại 1 toạ độ trong khônggian của đối tượng và ảnh được xem như là 1 tập hợp các điểm ảnh.

 Mức xám, màu: Là số các giá trị có thể có của các điểm ảnh của ảnh Nắn chỉnh biến dạng: Ảnh thu nhận thường bị biến dạng do các thiết bị

quang học và điện tử.

 Khử nhiễu: Có 2 loại nhiễu cơ bản trong quá trình thu nhận ảnh- Nhiễu hệ thống: là nhiễu có quy luật có thể khử bằng các phép biến đổi- Nhiễu ngẫu nhiên: vết bẩn không rõ nguyên nhân ->khắc phục bằng các phéplọc

 Chỉnh mức xám:

Nhằm khắc phục tính khơng đồng đều của hệ thống gây ra. Thơng thường có2 hướng tiếp cận:

o Giảm số mức xám: Thực hiện bằng cách nhóm các mức xám gầnnhau thành một bó. Trường hợp chỉ có 2 mức xám thì chính làchuyển về ảnh đen trắng. Ứng dụng: In ảnh màu ra máy inđen trắng.

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

o Tăng số mức xám: Thực hiện nội suy ra các mức xám trung gianbằng kỹ thuật nội suy. Kỹ thuật này nhằm tăng cường độ mịncho ảnh

 Trích chọn đặc điểm

- Các đặc điểm của đối tượng được trích chọn tuỳ theo mục đích nhận dạngtrong q trình xử lý ảnh. Có thể nêu ra một số đặc điểm của ảnh sau đây:- Đặc điểm không gian: Phân bố mức xám, phân bố xác suất, biên độ, điểmuốn v.v..

- Đặc điểm biến đổi: Các đặc điểm loại này được trích chọn bằng việc thựchiện lọc vùng (zonal filtering). Các bộ vùng được gọi là “mặt nạ đặc điểm” (featuremask) thường là các khe hẹp với hình dạng khác nhau (chữ nhật, tam giác, cungtròn v.v..)

- Đặc điểm biên và đường biên: Đặc trưng cho đường biên của đối tượng vàdo vậy rất hữu ích trong việc trích trọn các thuộc tính bất biến được dùng khi nhậndạng đối tượng. Các đặc điểm này có thể được trích chọn nhờ tốn tử gradient, tốntử la bàn, tốn tử Laplace, tốn tử “chéo khơng” (zero crossing) v.v..

Việc trích chọn hiệu quả các đặc điểm giúp cho việc nhận dạng các đối tượngảnh chính xác, với tốc độ tính tốn cao và dung lượng nhớ lưu trữ giảm xuống.

<b> Nhận dạng</b>

Nhận dạng tự động (automatic recognition), mô tả đối tượng, phân loại và phânnhóm các mẫu là những vấn đề quan trọng trong thị giác máy, được ứng dụng trong nhiều ngành khoa học khác nhau. Tuy nhiên, một câu hỏi đặt ra là: mẫu (pattern) là gì? Watanabe, một trong những người đi đầu trong lĩnh vực này đã định nghĩa: “Ngược lại với hỗn loạn (chaos), mẫu là một thực thể (entity), được xác định một cách ang áng (vaguely defined) và có thể gán cho nó một tên gọi nào đó”. Ví dụ mẫu có thể là ảnh của vân tay, ảnh của một vật nào đó được chụp, một chữ viết, khuôn mặt người hoặc một ký đồ tín hiệu tiếng nói. Khi biết một mẫu nào đó, để nhận dạng hoặc phân loại mẫu đó có thể:

Hoặc phân loại có mẫu (supervised classification), chẳng hạn phân tích phân biệt(discriminant analyis), trong đó mẫu đầu vào được định danh như một thành phần của một lớp đã xác định.

Hoặc phân loại khơng có mẫu (unsupervised classification hay clustering) trong đó các mẫu được gán vào các lớp khác nhau dựa trên một tiêu chuẩn đồng dạng nào đó. Các lớp này cho đến thời điểm phân loại vẫn chưa biết hay chưa được định danh.

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>3. Phương pháp thực hiện đề tài “Xuất dữ liệu từ ảnh thẻsinh viên”</b>

<b>3.1 Thư viện OpenCV</b>

OpenCV là mã nguồn mở của Intel, nó là một thư viện có khả năng nhúng vào trong các chương trình có khả năng nhận diện hình ảnh của máy tính .Nó bao gồm khả năng tiên tiến như phát hiện, theo dõi, nhận diện vật thể….. Ngồi ra, nó cung cấp rất nhiều các thuật tốn xử lý ảnh thơng qua các hàm API.

OpenCV hỗ trợ đa nền tảng. Nó hỗ trợ cả Windows và Linux, và gần đây hơnlà MacOSX. Với giao diện của nó là nền tảng độc lập.

Các ứng dụng chính của OpenCV: Đọc và ghi hình ảnh

 Chụp và lưu video

 Xử lý hình ảnh (lọc, biến đổi) Thực hiện phát hiện tính năng

 Phát hiện các đối tượng cụ thể như khuôn mặt, mắt, ô tô, trong video hoặc hình ảnh.

 Phân tích video, tức là ước tính chuyển động trong đó, trừ hậu cảnh và theo dõi các đối tượng trong đó.

<b>Thị giác máy tính</b>

Computer Vision có thể được định nghĩa là một mơn học giải thích cách tái tạo, ngắt và hiểu một cảnh 3D từ hình ảnh 2D của nó, xét về các thuộc tính của cấu trúc có trong cảnh đó. Nó đề cập đến việc mơ hình hóa và tái tạo tầm nhìn của con người bằng phần mềm và phần cứng máy tính.

Thị giác Máy tính trùng lặp đáng kể với các trường sau: Image Processing - Nó tập trung vào thao tác hình ảnh.

 Pattern Recognition - Nó giải thích các kỹ thuật khác nhau để phân loại các mẫu.

 Photogrammetry - Có liên quan đến việc thu được các phép đo chính xác từ hình ảnh.

<b>3.2 Sơ đồ khối mơ tả phương pháp</b>

Ảnh đầu vào là ảnh được chụp từ điện thoại nên sẽ có thành phần nhiễu cũngnhư vị trí ảnh bị lệch, dẫn đến khơng thể dùng phương pháp detect vật thể trực tiếp mà cần phải thực hiện xử lý ảnh như xoay thẳng, lọc nhiễu… Để việc nhận dạng chữ viết được diễn ra thuận lợi, chúng ta cần khoanh vùng vùng có chữ và cuối cùng mới tiến tới bước nhận dạng kí tự . Dưới đây là phương pháp đơn giản mà em sử dụng cho bài toán:

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i><b>3.2.1 Phát hiện góc thẻ</b></i>

Như đã nêu bên trên, việc thu thập ảnh là bước thủ cơng nên ảnh có thể bị xoay, nghiêng. Chúng ta thực hiện tìm đường viền cạnh (contours) bằng thư viện OpenCV.

Vậy contour là gì? Contour là tập hợp tất cả các điểm ảnh liên tục có cùng màu hoặc cường độ. Để thêm chính xác cho việc tìm contour thì ảnh đầu vào nên là ảnh đã được detected edge sử dụng Canny hoặc threshold edge detection.

Trong một bức ảnh có nhiều contours khác nhau phân tầng bằng quan hệ hierarchy, tuy vậy mục đích của chúng ta là đi tìm ra 4 góc của ảnh nên sẽ chỉ lấy contour có diện tích mặt lớn nhất và sau đó lấy ra hồnh độ và tung độ của 4 góc bằng hàm <small>approxPolyDP()</small>

<small>Mat img, img_resized, img_original, img_gray, img_canny, edged, hstack;img imread(="C:/Downloads/AI_PHOTOS/data/thesinhvien1.jpg");</small>

<small>resize(img, img_resized, Size(), 0.5, 0.5);</small>

<small>cvtColor(img_resized, img_original, COLOR_BGR2GRAY);</small>

<small>bilateralFilter(img_original, img_gray, 20, 30, 30);</small>

<small>Canny(img_gray, edged, 10, 20);</small>

<small>vector vector Point<<> > contours; // list of contours in an imagevector Vec4i<> hierarchy; // relationship of contours in an image</small>

<small>findContours(edged, contours, hierarchy, RETR_TREE CHAIN_APPROX_SIMPLE, );</small>

<small>int index = getMaxAreaContourId(contours);</small>

<small>Scalar color = Scalar(rng.uniform(0, 256), rng.uniform(0, 256), rng.uniform(0, 256));drawContours(img_resized, contours, (int)index, color, 2, LINE_8, hierarchy, 0);// Find four corner points</small>

<small>vector<cv::Point2i> approx;</small>

<small>approxPolyDP(contours index[], approx, 40, true);</small>

<small>for auto ( p : approx){</small>

<small>cout << p.x << endl;cout << p.y << endl;</small>

<small>if (p.y > mean[ ]1 ) bottomCorners.push_back(p);</small>

<small>if (p.y < mean[ ]1 ) topCorners.push_back(p);}</small>

<small>if (topCorners[ ]0.x > topCorners[1].x) {swap(topCorners[0], topCorners[ ]1 );}</small>

<small>if (bottomCorners[ ]0.x > bottomCorners[1].x) {</small>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<i><b>3.2.2 Một số phép biến đổi ảnh</b></i>

<b>- Biến đổi phối cảnh (perspective transform):</b>

Để biến đổi phối cảnh thì chúng ta cần một ma trận biến đổi 3x3. Đườngthẳng sẽ giữ nguyên là đường thẳng sau biến đổi. Để tìm ra ma trận biến đổi này,chúng ta sử dụng 4 góc của ảnh đã phát hiện ở trên. Thông qua

<b>getPerspectiveTransform() </b>áp dụng<b> warpPerspective() </b>với matrận biến đổi 3x3.

Ảnh sau khi thực hiện phép biến đổi đã được đặt về vị trí thẳng cố định, giúp việc nhận dạng chữ trở nên dễ dàng hơn.

<i><b>3.2.3 Phát hiện vùng chữ</b></i>

Chúng ta thực hiện phân đoạn màu để chuyển ảnh về dạng nhị phân (chỉvùng đen và trắng) sau đấy kết nối những vùng ký tự trắng liên tục bằng phươngthức <small>getStructuringElement() </small>và cuối cùng là tìm đường viền (contour) thỏa mãnngưỡng tỷ lệ co và xóa phần không thỏa mãn tỷ lệ cũng như vẽ thêm contour giữ lạibằng các bounding box xấp xỉ với contours.

<small>cv::threshold(img_sobel, img_threshold, 0, 255, THRESH_OTSU + THRESH_BINARY);</small>

<small>element = getStructuringElement(cv::MORPH_RECT, cv::Size(20, 7));cv::morphologyEx(img_threshold img_threshold, , MORPH_GRADIENT, element);</small>

<small>// draw rectangles on output image</small>

<small>rectangle(output, letterBBoxes1[i], cv::Scalar(0, 255, 0), 3, 1, 0);</small>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Tesseract OCR – phát triển bởi HP, được đề xuất là bộ nhận dạng kí tự mạnhmẽ với mã nguồn mở và được sử dụng phổ biến. Tesseract chuyển đổi hình ảnh 2Dcủa văn bản, chứa văn bản được in bằng máy hoặc chữ viết tay thành văn bản điệntử.

Cấu trúc của Tesseract

Tạo ngưỡng thích nghi giúp loại bỏ các yếu tố nền của hình ảnh (ví dụ như ánh sáng, bóng,…) và giúp phân tích các pixel thành ảnh nhị phân.

Nhận dạng được tiến hành qua một quá trình với hai lần nhận dạng. Lần thứ nhất: nhận ra lần lượt từng từ. Mỗi từ có nghĩa là đạt yêu cầu và được thông qua và được lưu vào dữ liệu. Lần thứ hai, khi phân loại thích ứng, cơng cụ sẽ nhận dạng lại các từ không được nhận dạng tốt ở lần trước đó.

<b>Xác định dịng</b>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Mục đích của bước này là nhận dạng các dịng của các hình ảnh bị nghiêng, giúp giảm sự mất thông tin khi nhận dạng ảnh nghiêng. Các bộ phận quan trọng củaquá trình này là lọc dãy màu (còn được gọi là blobs) và xây dựng dòng. Bước này cũng giúp loại bỏ các văn bản có drop-cap.

<b>Thiết lập dịng cơ sở</b>

Khi dịng văn bản được tìm thấy, các dịng cơ sở được thiết lập chính xác hơnbằng cách sử dụng một đường có tên là spline tồn phương (là dịng mà được kếthợp từ nhiều đoạn). Nó giúp Tesseract xử lý các trang có đường cơ sở là đườngcong.

Các dòng cơ sở được thiết lập bằng cách phân vùng các blobs thành cácnhóm có thể thay thế thích hợp liên tục trong đường cơ sở thẳng ban đầu. Mộtspline toàn phương được thiết lập cho phân vùng dày đặc nhất, (giả định là đườngcơ sở) của một hình có phương ít nhất. Spline có lợi thế là tính tốn ổn định, nhượcđiểm là sự gián đoạn có thể xảy ra khi nhiều phân đoạn spline được yêu cầu.

<b>Cắt nhỏ từ</b>

Tesseract sẽ xác định xem có các ký tự dính với nhau trong một từ haykhơng. Nếu có nó sẽ cắt nhỏ các ký tự ra thành các ký tự riêng lẻ.

<b>Nhận dạng khoảng cách giữa chữ hoặc số</b>

Xác định khoảng cách giữa các số hoặc giữa các chữ là một vấn đề khá phứctạp. Tesseract giải quyết những vấn đề này bằng cách đo khoảng cách trong mộtphạm vi hạn chế theo chiều dọc giữa dịng cơ sở và dịng trung bình.

<small>tesseract::TessBaseAPI* ocr = new tesseract::TessBaseAPI();</small>

<small>ocr->Init("D:\\KTLT\\vcpkg\\installed\\x64-windows\\include\\tesseract_data" "eng", , tesseract::OEM_LSTM_ONLY);</small>

<small>// Phan chia ky tu</small>

Duyệt với từng bounding box và thực hiện OCR:

<small>for int ( i = 0; i < letterBBoxes1.size(); i++) {</small>

<small>rectangle(output, letterBBoxes1[i], cv::Scalar(0, 255, 0), 1, 1, 0);Mat cropped_image = output(letterBBoxes1 i ;[ ])</small>

<small>ocr->SetImage(cropped_image.data, cropped_image.cols, cropped_image.rows, 3, cropped_image.step);</small>

<small>string outText = string(ocr->GetUTF8Text()); </small>

</div>

×