Trong thực tế vì lý do nao đó chúng ta không thể kết nối với thiết bị đo, bắt buộc phải nhập data bằng tay hoặc để tránh làm giả số liệu. Chúng ta sử dụng phương pháp camera vision đọc giá trị hiển thị kết quả trên led 7 đoạn
Bước 1: Chúng ta viết chươngtrình chụp ảnh và lưu file ảnh đơn giản như sau :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<span style="color: #993300;"><strong>import cv2</strong></span> <span style="color: #993300;"><strong>cam = cv2.VideoCapture(0)</strong></span> <span style="color: #993300;"><strong>cv2.namedWindow("camera capture")</strong></span> <span style="color: #993300;"><strong>img_counter = 0</strong></span> <span style="color: #993300;"><strong>while True:</strong></span> <span style="color: #993300;"><strong> ret, frame = cam.read()</strong></span> <span style="color: #993300;"><strong> cv2.rectangle(frame, (450, 250), (780, 450), (0, 255, 0), 3)</strong></span> <span style="color: #993300;"><strong> if not ret:</strong></span> <span style="color: #993300;"><strong> print("Loi chup anh")</strong></span> <span style="color: #993300;"><strong> break</strong></span> <span style="color: #993300;"><strong> cv2.imshow("camera capture", frame)</strong></span> <span style="color: #993300;"><strong> k = cv2.waitKey(1)</strong></span> <span style="color: #993300;"><strong> if k%256 == 27:</strong></span> <span style="color: #993300;"><strong> # ESC pressed</strong></span> <span style="color: #993300;"><strong> print("thoat va dong chuong trinh")</strong></span> <span style="color: #993300;"><strong> break</strong></span> <span style="color: #993300;"><strong> elif k%256 == 32:</strong></span> <span style="color: #993300;"><strong> # bam nut space de chup va luu anh</strong></span> <span style="color: #993300;"><strong> img_name = "led_7seg_{}.png".format(img_counter)</strong></span> <span style="color: #993300;"><strong> cv2.imwrite(img_name, frame)</strong></span> <span style="color: #993300;"><strong> print("{} written!".format(img_name))</strong></span> <span style="color: #993300;"><strong> img_counter += 1</strong></span> <span style="color: #993300;"><strong>cam.release()</strong></span> <span style="color: #993300;"><strong>cv2.destroyAllWindows()</strong></span> |
Mục đích của chương trình là tạo 1 khung hình chữ nhật màu xanh, đưa đối tượng cần phát hiện vào khung hình để chương trình đọc led 7 đoạn phát hiện đối tượng nhanh chóng như hình trên và tiến hành chụp ảnh lấy hình mẫu .
Bước 2: Tìm hiểu về led 7 đoạn:
Chúng ta sẽ sử dụng thuật toán phát hiện 7 đoạn và đọc kết quả hiện thị theo nguyên lý hiển thị của led 7 đoạn. Led 7 đoạn cấu tạo gồm 7 thanh led nhỏ , nếu hiển thị mô hỏng lại ký tự số học từ 0–>9 ta có data khai báo theo kiểu từ điển sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# khai báo sử dụng thư viện cần thiết from imutils.perspective import four_point_transform from imutils import contours import imutils import cv2 #Khai báo thư viện tra cứu hiển thi 7 đoạn #[1, 0, 1, 1, 1, 0, 1] DIGITS_LOOKUP = { (1, 1, 1, 0, 1, 1, 1): 0, (0, 0, 0, 0, 0, 0, 0): 1, (1, 0, 1, 1, 1, 0, 1): 2, (1, 0, 1, 1, 0, 1, 1): 3, (0, 1, 1, 1, 0, 1, 0): 4, (1, 1, 0, 1, 0, 1, 1): 5, (1, 1, 0, 1, 1, 1, 1): 6, (1, 0, 1, 0, 0, 1, 0): 7, (1, 1, 1, 1, 1, 1, 1): 8, (1, 1, 1, 1, 0, 1, 1): 9 } |
Tiến hành xử ảnh thông thường và tiến ành Roi cắt vào cần xử lý chính. Sau đó tiến hành tách từng ký tự led 7 đoạn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<span style="color: #993300;"><strong>area = 0</strong></span> <span style="color: #993300;"><strong>rate = 0</strong></span> <span style="color: #993300;"><strong># tai hinh anh xử lý</strong></span> <span style="color: #993300;"><strong>image = cv2.imread("led_7seg_26.png")</strong></span> <span style="color: #993300;"><strong># Các bước tiền xử lý ảnh cơ bản</strong></span> <span style="color: #993300;"><strong>gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</strong></span> <span style="color: #993300;"><strong>blurred = cv2.GaussianBlur(gray, (5, 5), 0)</strong></span> <span style="color: #993300;"><strong>edged = cv2.Canny(blurred, 50, 200, 255)</strong></span> <span style="color: #993300;"><strong># tìm đương viên bao quanh với ảnh tiền xử lý</strong></span> <span style="color: #993300;"><strong>cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,</strong></span> <span style="color: #993300;"><strong> cv2.CHAIN_APPROX_SIMPLE)</strong></span> <span style="color: #993300;"><strong>cnts = imutils.grab_contours(cnts)</strong></span> <span style="color: #993300;"><strong># Sắp sếp đường viền bao quanh theo thứ từ từ lớn đến nhỏ theo diện tích</strong></span> <span style="color: #993300;"><strong>cnts = sorted(cnts, key=cv2.contourArea, reverse=True)</strong></span> <span style="color: #993300;"><strong># Tiến hành ROI ảnh vào vùng cần xử lý chính</strong></span> <span style="color: #993300;"><strong>warped = gray[255:445, 455:775]#250:450, 450:780 [y1:y2,x1:x2] [255:345, 455:775]</strong></span> <span style="color: #993300;"><strong>output = image[255:445, 455:775]#250:450, 450:780 [255:345, 455:775]</strong></span> <span style="color: #993300;"><strong>#Tiến hành lọc ảnh theo ngưỡng</strong></span> <span style="color: #993300;"><strong>thresh = cv2.threshold(warped, 200, 255,</strong></span> <span style="color: #993300;"><strong> cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]</strong></span> <span style="color: #993300;"><strong>#áp dụng một loạt các thao tác hình thái học để làm sạch hình ảnh đã lọc ngưỡng</strong></span> <span style="color: #993300;"><strong>kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 1))</strong></span> <span style="color: #993300;"><strong>thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)</strong></span> <span style="color: #993300;"><strong>#thresh = cv2.erode(thresh, None, iterations=2)</strong></span> <span style="color: #993300;"><strong>thresh = cv2.dilate(thresh, None, iterations=2)</strong></span> <span style="color: #993300;"><strong># Tìm đường bao với ảnh đã lọc ngưỡng</strong></span> <span style="color: #993300;"><strong># khởi tạo list các ký tự</strong></span> <span style="color: #993300;"><strong>cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,</strong></span> <span style="color: #993300;"><strong> cv2.CHAIN_APPROX_SIMPLE)</strong></span> <span style="color: #993300;"><strong>cnts = imutils.grab_contours(cnts)</strong></span> <span style="color: #993300;"><strong>digitCnts = []</strong></span> <span style="color: #993300;"><strong># Tạo vòng lặp với các đường viên bao quanh</strong></span> <span style="color: #993300;"><strong>for c in cnts:</strong></span> <span style="color: #993300;"><strong> # tính toán kích thước hộp bao quanh</strong></span> <span style="color: #993300;"><strong> (x, y, w, h) = cv2.boundingRect(c)</strong></span> <span style="color: #993300;"><strong> print("x,y,w,h = {},{},{},{}".format(x, y, w, h))</strong></span> <span style="color: #993300;"><strong> # Lọc ra các kích thuóc của các ký tư</strong></span> <span style="color: #993300;"><strong> if w >= 20 and (h >= 60 and h <= 80):</strong></span> <span style="color: #993300;"><strong> digitCnts.append(c)</strong></span> <span style="color: #993300;"><strong>#sắp xếp các đường bao từ trái sang phải, sau đó tự khởi tạo các chữ số thực tế</strong></span> <span style="color: #993300;"><strong>digitCnts = contours.sort_contours(digitCnts,</strong></span> <span style="color: #993300;"><strong> method="left-to-right")[0]</strong></span> <span style="color: #993300;"><strong>digits = []</strong></span> |
Sau đó tính toán từng đoạn và đọc giá gị các đoạn của led 7 đoạn:
1 2 3 4 5 |
<strong><span style="color: #993300;"># Vòng lặp cho từng ký tự led 7 đoạn</span></strong> <strong><span style="color: #993300;">for c in digitCnts:</span></strong> <strong><span style="color: #993300;"> # Roi vào các ký tự chính xác cần tìm</span></strong> <strong><span style="color: #993300;"> (x, y, w, h) = cv2.boundingRect(c)</span></strong> <strong><span style="color: #993300;"> print("x1,y1,w1,h1 = {},{},{},{}</span></strong> |
1 2 3 4 5 6 7 8 9 |
<strong><span style="color: #993300;">".format(x, y, w, h))</span></strong> <strong><span style="color: #993300;"> if w>= 20 and w<= 29:</span></strong> <strong><span style="color: #993300;"> roi = thresh[y:y + h, x-w:x + w]</span></strong> <strong><span style="color: #993300;"> elif w> 29 :</span></strong> <strong><span style="color: #993300;"> roi = thresh[y:y + h, x:x + w]</span></strong> <strong><span style="color: #993300;"> cv2.imshow("thresh", thresh)</span></strong><strong><span style="color: #993300;"> cv2.imshow("warped", warped)</span></strong> <strong><span style="color: #993300;"> cv2.imshow("roi", roi)</span></strong> <strong><span style="color: #993300;"> #Tính toán độ rộng và chiều cao của mỗi đoạn của led 7 đoạn</span></strong> |
1 |
<strong><span style="color: #993300;"> (roiH, roiW) = roi.shape</span></strong> |
1 2 3 4 5 6 |
<strong><span style="color: #993300;"> (dW, dH) = (int(roiW * 0.25), int(roiH * 0.25))</span></strong> <strong><span style="color: #993300;"> dHC = int(roiH * 0.05)</span></strong> <strong><span style="color: #993300;"> # Khai báo led 7 đoạn</span></strong> <strong><span style="color: #993300;"> segments = [</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), 0), (w, dH)), # top</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), 0+(dH//2)), (dW, h //</span></strong> |
1 2 3 4 5 |
<strong><span style="color: #993300;"> 2)), # top-left</span></strong> <strong><span style="color: #993300;"> ((w - 2*dW, 0), (w, h // 2)), # top-right</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), (h // 2) - dHC) , (w-(dW//2), (h // 2) + dHC)), # center</span></strong> <strong><span style="color: #993300;"> ((0, h // 2), (dW, h)), # bottom-left</span></strong> <strong><span style="color: #993300;"> ((w - dW, h // 2), (w-(dW//2), h-(</span></strong> |
1 2 3 4 |
<strong><span style="color: #993300;">dH//2))), # bottom-right</span></strong> <strong><span style="color: #993300;"> ((0, h - dH), (w-(dW//2), h)) # bottom</span></strong> <strong><span style="color: #993300;"> ]</span></strong> <strong><span style="color: #993300;"> on = [0] * len(segments)</span></strong> |
1 2 3 |
<strong><span style="color: #993300;"> # Vòng lặp cho led 7 đoạn</span></strong> <strong><span style="color: #993300;"> for (i, ((xA, yA), (xB, yB))) in enumerate(segments):</span></strong> <strong><span style="color: #993300;"> # Trích xuất vùng roi led 7 đ</span></strong> |
1 |
1 2 3 |
<strong><span style="color: #993300;">oạn, Tính toán tỉ lệ % của phần lọc ngưỡng khác không trên tổng diện tích</span></strong> <strong><span style="color: #993300;"> segROI = roi[yA:yB, x</span></strong> |
1 |
<strong><span style="color: #993300;">A:xB]</span></strong> |
1 2 3 4 5 |
<strong><span style="color: #993300;"> cv2.imshow("segRoi",segROI)</span></strong> <strong><span style="color: #993300;"> total = cv2.countNonZero(segROI)</span></strong> <strong><span style="color: #993300;"> area = (xB - xA) * (yB - yA)</span></strong> <strong><span style="color: #993300;"> # Nếu tổng pixel khác không</span></strong> |
1 2 3 4 5 6 7 8 9 10 11 |
<strong><span style="color: #993300;"> lớn 0.6 thì quy định đoạn led có giá trị 1</span></strong> <strong><span style="color: #993300;"> if area == 0 :</span></strong><strong><span style="color: #993300;"> rate = 0</span></strong> <strong><span style="color: #993300;"> else:</span></strong><strong><span style="color: #993300;"> rate = total / float(area)</span></strong> <strong><span style="color: #993300;"> print("S[{}]={}".format(i,rate))</span></strong> <strong><span style="color: #993300;"> if i ==3 and (rate >= 0.6):</span></strong> <strong><span style="color: #993300;"> on[3] = 1</span></strong> <strong><span style="color: #993300;"> elif rate >= 0.6:# rate</span></strong> <strong><span style="color: #993300;"> on[i]= 1</span></strong> <strong><span style="color: #993300;"> cv2.waitKey()</span></strong> <strong><span style="color: #993300;"> print(on)</span></strong> |
print(“———————“)
cv2.waitKey()
Tiến hành tra từ điển led 7 đoạn và hiện thị kết quả:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<strong><span style="color: #993300;"> #Tra cứu từ điển led 7 đoạn</span></strong> <strong><span style="color: #993300;"> digit = DIGITS_LOOKUP[tuple(on)]</span></strong> <strong><span style="color: #993300;"> digits.append(digit)</span></strong> <strong><span style="color: #993300;"> cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 1)</span></strong> <strong><span style="color: #993300;"> cv2.putText(output, str(digit), (x - 10, y +3),</span></strong> <strong><span style="color: #993300;"> cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 255, 0), 2)</span></strong> <strong><span style="color: #993300;"># Hiển thị ký tự</span></strong> <strong><span style="color: #993300;">print(digits)</span></strong> <strong><span style="color: #993300;">cv2.imshow("Input", image)</span></strong> <strong><span style="color: #993300;">cv2.imshow("Output", output)</span></strong> <strong><span style="color: #993300;">cv2.waitKey(0)</span></strong> |
Toàn full code phần xử lý led 7 đoạn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
<strong><span style="color: #993300;"># khai báo sử dụng thư viện cần thiết</span></strong> <strong><span style="color: #993300;">from imutils.perspective import four_point_transform</span></strong> <strong><span style="color: #993300;">from imutils import contours</span></strong> <strong><span style="color: #993300;">import imutils</span></strong> <strong><span style="color: #993300;">import cv2</span></strong> <strong><span style="color: #993300;">#Khai báo thư viện tra cứu hiển thi 7 đoạn</span></strong> <strong><span style="color: #993300;">#[1, 0, 1, 1, 1, 0, 1]</span></strong> <strong><span style="color: #993300;">DIGITS_LOOKUP = {</span></strong> <strong><span style="color: #993300;"> (1, 1, 1, 0, 1, 1, 1): 0,</span></strong> <strong><span style="color: #993300;"> (0, 0, 0, 0, 0, 0, 0): 1,</span></strong> <strong><span style="color: #993300;"> (1, 0, 1, 1, 1, 0, 1): 2,</span></strong> <strong><span style="color: #993300;"> (1, 0, 1, 1, 0, 1, 1): 3,</span></strong> <strong><span style="color: #993300;"> (0, 1, 1, 1, 0, 1, 0): 4,</span></strong> <strong><span style="color: #993300;"> (1, 1, 0, 1, 0, 1, 1): 5,</span></strong> <strong><span style="color: #993300;"> (1, 1, 0, 1, 1, 1, 1): 6,</span></strong> <strong><span style="color: #993300;"> (1, 0, 1, 0, 0, 1, 0): 7,</span></strong> <strong><span style="color: #993300;"> (1, 1, 1, 1, 1, 1, 1): 8,</span></strong> <strong><span style="color: #993300;"> (1, 1, 1, 1, 0, 1, 1): 9</span></strong> <strong><span style="color: #993300;">}</span></strong> <strong><span style="color: #993300;">area = 0</span></strong> <strong><span style="color: #993300;">rate = 0</span></strong> <strong><span style="color: #993300;"># tai hinh anh xử lý</span></strong> <strong><span style="color: #993300;">image = cv2.imread("led_7seg_26.png")</span></strong> <strong><span style="color: #993300;"># Các bước tiền xử lý ảnh cơ bản</span></strong> <strong><span style="color: #993300;">gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)</span></strong> <strong><span style="color: #993300;">blurred = cv2.GaussianBlur(gray, (5, 5), 0)</span></strong> <strong><span style="color: #993300;">edged = cv2.Canny(blurred, 50, 200, 255)</span></strong> <strong><span style="color: #993300;"># tìm đương viên bao quanh với ảnh tiền xử lý</span></strong> <strong><span style="color: #993300;">cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,</span></strong> <strong><span style="color: #993300;"> cv2.CHAIN_APPROX_SIMPLE)</span></strong> <strong><span style="color: #993300;">cnts = imutils.grab_contours(cnts)</span></strong> <strong><span style="color: #993300;"># Sắp sếp đường viền bao quanh theo thứ từ từ lớn đến nhỏ theo diện tích</span></strong> <strong><span style="color: #993300;">cnts = sorted(cnts, key=cv2.contourArea, reverse=True)</span></strong> <strong><span style="color: #993300;"># Tiến hành ROI ảnh vào vùng cần xử lý chính</span></strong> <strong><span style="color: #993300;">warped = gray[255:445, 455:775]#250:450, 450:780 [y1:y2,x1:x2] [255:345, 455:775]</span></strong> <strong><span style="color: #993300;">output = image[255:445, 455:775]#250:450, 450:780 [255:345, 455:775]</span></strong> <strong><span style="color: #993300;">#Tiến hành lọc ảnh theo ngưỡng</span></strong> <strong><span style="color: #993300;">thresh = cv2.threshold(warped, 200, 255,</span></strong> <strong><span style="color: #993300;"> cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]</span></strong> <strong><span style="color: #993300;">#áp dụng một loạt các thao tác hình thái học để làm sạch hình ảnh đã lọc ngưỡng</span></strong> <strong><span style="color: #993300;">kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 1))</span></strong> <strong><span style="color: #993300;">thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)</span></strong> <strong><span style="color: #993300;">#thresh = cv2.erode(thresh, None, iterations=2)</span></strong> <strong><span style="color: #993300;">thresh = cv2.dilate(thresh, None, iterations=2)</span></strong> <strong><span style="color: #993300;"># Tìm đường bao với ảnh đã lọc ngưỡng</span></strong> <strong><span style="color: #993300;"># khởi tạo list các ký tự</span></strong> <strong><span style="color: #993300;">cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,</span></strong> <strong><span style="color: #993300;"> cv2.CHAIN_APPROX_SIMPLE)</span></strong> <strong><span style="color: #993300;">cnts = imutils.grab_contours(cnts)</span></strong> <strong><span style="color: #993300;">digitCnts = []</span></strong> <strong><span style="color: #993300;"># Tạo vòng lặp với các đường viên bao quanh</span></strong> <strong><span style="color: #993300;">for c in cnts:</span></strong> <strong><span style="color: #993300;"> # tính toán kích thước hộp bao quanh</span></strong> <strong><span style="color: #993300;"> (x, y, w, h) = cv2.boundingRect(c)</span></strong> <strong><span style="color: #993300;"> print("x,y,w,h = {},{},{},{}".format(x, y, w, h))</span></strong> <strong><span style="color: #993300;"> # Lọc ra các kích thuóc của các ký tư</span></strong> <strong><span style="color: #993300;"> if w >= 20 and (h >= 60 and h <= 80):</span></strong> <strong><span style="color: #993300;"> digitCnts.append(c)</span></strong> <strong><span style="color: #993300;">#sắp xếp các đường bao từ trái sang phải, sau đó tự khởi tạo các chữ số thực tế</span></strong> <strong><span style="color: #993300;">digitCnts = contours.sort_contours(digitCnts,</span></strong> <strong><span style="color: #993300;"> method="left-to-right")[0]</span></strong> <strong><span style="color: #993300;">digits = []</span></strong> <strong><span style="color: #993300;"># Vòng lặp cho từng ký tự led 7 đoạn</span></strong> <strong><span style="color: #993300;">for c in digitCnts:</span></strong> <strong><span style="color: #993300;"> # Roi vào các ký tự chính xác cần tìm</span></strong> <strong><span style="color: #993300;"> (x, y, w, h) = cv2.boundingRect(c)</span></strong> <strong><span style="color: #993300;"> print("x1,y1,w1,h1 = {},{},{},{}".format(x, y, w, h))</span></strong> <strong><span style="color: #993300;"> if w>= 20 and w<= 29:</span></strong> <strong><span style="color: #993300;"> roi = thresh[y:y + h, x-w:x + w]</span></strong> <strong><span style="color: #993300;"> elif w> 29 :</span></strong> <strong><span style="color: #993300;"> roi = thresh[y:y + h, x:x + w]</span></strong> <strong><span style="color: #993300;"> cv2.imshow("thresh", thresh)</span></strong> <strong><span style="color: #993300;"> cv2.imshow("warped", warped)</span></strong> <strong><span style="color: #993300;"> cv2.imshow("roi", roi)</span></strong> <strong><span style="color: #993300;"> #Tính toán độ rộng và chiều cao của mỗi đoạn của led 7 đoạn</span></strong> <strong><span style="color: #993300;"> (roiH, roiW) = roi.shape</span></strong> <strong><span style="color: #993300;"> (dW, dH) = (int(roiW * 0.25), int(roiH * 0.25))</span></strong> <strong><span style="color: #993300;"> dHC = int(roiH * 0.05)</span></strong> <strong><span style="color: #993300;"> # Khai báo led 7 đoạn</span></strong> <strong><span style="color: #993300;"> segments = [</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), 0), (w, dH)), # top</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), 0+(dH//2)), (dW, h // 2)), # top-left</span></strong> <strong><span style="color: #993300;"> ((w - 2*dW, 0), (w, h // 2)), # top-right</span></strong> <strong><span style="color: #993300;"> ((0+(dW//2), (h // 2) - dHC) , (w-(dW//2), (h // 2) + dHC)), # center</span></strong> <strong><span style="color: #993300;"> ((0, h // 2), (dW, h)), # bottom-left</span></strong> <strong><span style="color: #993300;"> ((w - dW, h // 2), (w-(dW//2), h-(dH//2))), # bottom-right</span></strong> <strong><span style="color: #993300;"> ((0, h - dH), (w-(dW//2), h)) # bottom</span></strong> <strong><span style="color: #993300;"> ]</span></strong> <strong><span style="color: #993300;"> on = [0] * len(segments)</span></strong> <strong><span style="color: #993300;"> # Vòng lặp cho led 7 đoạn</span></strong> <strong><span style="color: #993300;"> for (i, ((xA, yA), (xB, yB))) in enumerate(segments):</span></strong> <strong><span style="color: #993300;"> # Trích xuất vùng roi led 7 đoạn, Tính toán tỉ lệ % của phần lọc ngưỡng khác không trên tổng diện tích</span></strong> <strong><span style="color: #993300;"> segROI = roi[yA:yB, xA:xB]</span></strong> <strong><span style="color: #993300;"> cv2.imshow("segRoi",segROI)</span></strong> <strong><span style="color: #993300;"> total = cv2.countNonZero(segROI)</span></strong> <strong><span style="color: #993300;"> area = (xB - xA) * (yB - yA)</span></strong> <strong><span style="color: #993300;"> # Nếu tổng pixel khác không lớn 0.6 thì quy định đoạn led có giá trị 1</span></strong> <strong><span style="color: #993300;"> if area == 0 :</span></strong> <strong><span style="color: #993300;"> rate = 0</span></strong> <strong><span style="color: #993300;"> else:</span></strong> <strong><span style="color: #993300;"> rate = total / float(area)</span></strong> <strong><span style="color: #993300;"> print("S[{}]={}".format(i,rate))</span></strong> <strong><span style="color: #993300;"> if i ==3 and (rate >= 0.6):</span></strong> <strong><span style="color: #993300;"> on[3] = 1</span></strong> <strong><span style="color: #993300;"> elif rate >= 0.6:# rate</span></strong> <strong><span style="color: #993300;"> on[i]= 1</span></strong> <strong><span style="color: #993300;"> cv2.waitKey()</span></strong> <strong><span style="color: #993300;"> print(on)</span></strong> <strong><span style="color: #993300;"> print("---------------------")</span></strong> <strong><span style="color: #993300;"> cv2.waitKey()</span></strong> <strong><span style="color: #993300;"> #Tra cứu từ điển led 7 đoạn</span></strong> <strong><span style="color: #993300;"> digit = DIGITS_LOOKUP[tuple(on)]</span></strong> <strong><span style="color: #993300;"> digits.append(digit)</span></strong> <strong><span style="color: #993300;"> cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 1)</span></strong> <strong><span style="color: #993300;"> cv2.putText(output, str(digit), (x - 10, y +3),</span></strong> <strong><span style="color: #993300;"> cv2.FONT_HERSHEY_SIMPLEX, 0.65, (0, 255, 0), 2)</span></strong> <strong><span style="color: #993300;"># Hiển thị ký tự</span></strong> <strong><span style="color: #993300;">print(digits)</span></strong> <strong><span style="color: #993300;">cv2.imshow("Input", image)</span></strong> <strong><span style="color: #993300;">cv2.imshow("Output", output)</span></strong> <strong><span style="color: #993300;">cv2.waitKey(0)</span></strong> |