diff --git a/大作业/14.1/14.1.py b/大作业/14.1/14.1.py new file mode 100644 index 0000000..9710518 --- /dev/null +++ b/大作业/14.1/14.1.py @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- + +import cv2 +import numpy as np + + +def stretch(img): + ''' + 图像拉伸函数 + ''' + maxi=float(img.max()) + mini=float(img.min()) + + for i in range(img.shape[0]): + for j in range(img.shape[1]): + img[i,j]=(255/(maxi-mini)*img[i,j]-(255*mini)/(maxi-mini)) + + return img + +def dobinaryzation(img): + ''' + 二值化处理函数 + ''' + maxi=float(img.max()) + mini=float(img.min()) + + x=maxi-((maxi-mini)/2) + #二值化,返回阈值ret 和 二值化操作后的图像thresh + ret,thresh=cv2.threshold(img,x,255,cv2.THRESH_BINARY) + #返回二值化后的黑白图像 + return thresh + +def find_rectangle(contour): + ''' + 寻找矩形轮廓 + ''' + y,x=[],[] + + for p in contour: + y.append(p[0][0]) + x.append(p[0][1]) + + return [min(y),min(x),max(y),max(x)] + +def locate_license(img,afterimg): + ''' + 定位车牌号 + ''' + contours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) + + #找出最大的三个区域 + block=[] + for c in contours: + #找出轮廓的左上点和右下点,由此计算它的面积和长度比 + r=find_rectangle(c) + a=(r[2]-r[0])*(r[3]-r[1]) #面积 + s=(r[2]-r[0])*(r[3]-r[1]) #长度比 + + block.append([r,a,s]) + #选出面积最大的3个区域 + block=sorted(block,key=lambda b: b[1])[-3:] + + #使用颜色识别判断找出最像车牌的区域 + maxweight,maxindex=0,-1 + for i in range(len(block)): + b=afterimg[block[i][0][1]:block[i][0][3],block[i][0][0]:block[i][0][2]] + #BGR转HSV + hsv=cv2.cvtColor(b,cv2.COLOR_BGR2HSV) + #蓝色车牌的范围 + lower=np.array([100,50,50]) + upper=np.array([140,255,255]) + #根据阈值构建掩膜 + mask=cv2.inRange(hsv,lower,upper) + #统计权值 + w1=0 + for m in mask: + w1+=m/255 + + w2=0 + for n in w1: + w2+=n + + #选出最大权值的区域 + if w2>maxweight: + maxindex=i + maxweight=w2 + + return block[maxindex][0] + +def find_license(img): + ''' + 预处理函数 + ''' + m=400*img.shape[0]/img.shape[1] + + #压缩图像 + img=cv2.resize(img,(400,int(m)),interpolation=cv2.INTER_CUBIC) + + #BGR转换为灰度图像 + gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) + + #灰度拉伸 + stretchedimg=stretch(gray_img) + + '''进行开运算,用来去除噪声''' + r=16 + h=w=r*2+1 + kernel=np.zeros((h,w),np.uint8) + cv2.circle(kernel,(r,r),r,1,-1) + #开运算 + openingimg=cv2.morphologyEx(stretchedimg,cv2.MORPH_OPEN,kernel) + #获取差分图,两幅图像做差 cv2.absdiff('图像1','图像2') + strtimg=cv2.absdiff(stretchedimg,openingimg) + + #图像二值化 + binaryimg=dobinaryzation(strtimg) + + #canny边缘检测 + canny=cv2.Canny(binaryimg,binaryimg.shape[0],binaryimg.shape[1]) + + '''消除小的区域,保留大块的区域,从而定位车牌''' + #进行闭运算 + kernel=np.ones((5,19),np.uint8) + closingimg=cv2.morphologyEx(canny,cv2.MORPH_CLOSE,kernel) + + #进行开运算 + openingimg=cv2.morphologyEx(closingimg,cv2.MORPH_OPEN,kernel) + + #再次进行开运算 + kernel=np.ones((11,5),np.uint8) + openingimg=cv2.morphologyEx(openingimg,cv2.MORPH_OPEN,kernel) + + #消除小区域,定位车牌位置 + rect=locate_license(openingimg,img) + + return rect,img + +def cut_license(afterimg,rect): + ''' + 图像分割函数 + ''' + #转换为宽度和高度 + rect[2]=rect[2]-rect[0] + rect[3]=rect[3]-rect[1] + rect_copy=tuple(rect.copy()) + rect=[0,0,0,0] + #创建掩膜 + mask=np.zeros(afterimg.shape[:2],np.uint8) + #创建背景模型 大小只能为13*5,行数只能为1,单通道浮点型 + bgdModel=np.zeros((1,65),np.float64) + #创建前景模型 + fgdModel=np.zeros((1,65),np.float64) + #分割图像 + cv2.grabCut(afterimg,mask,rect_copy,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) + mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8') + img_show=afterimg*mask2[:,:,np.newaxis] + + return img_show + +def deal_license(licenseimg): + ''' + 车牌图片二值化 + ''' + #车牌变为灰度图像 + gray_img=cv2.cvtColor(licenseimg,cv2.COLOR_BGR2GRAY) + + #均值滤波 去除噪声 + kernel=np.ones((3,3),np.float32)/9 + gray_img=cv2.filter2D(gray_img,-1,kernel) + + #二值化处理 + ret,thresh=cv2.threshold(gray_img,120,255,cv2.THRESH_BINARY) + + return thresh + + +def find_end(start,arg,black,white,width,black_max,white_max): + end=start+1 + for m in range(start+1,width-1): + if (black[m] if arg else white[m])>(0.98*black_max if arg else 0.98*white_max): + end=m + break + return end + + +if __name__=='__main__': + img=cv2.imread('car.jpg',cv2.IMREAD_COLOR) + #预处理图像 + rect,afterimg=find_license(img) + + #框出车牌号 + cv2.rectangle(afterimg,(rect[0],rect[1]),(rect[2],rect[3]),(0,255,0),2) + cv2.imshow('afterimg',afterimg) + + #分割车牌与背景 + cutimg=cut_license(afterimg,rect) + cv2.imshow('cutimg',cutimg) + + #二值化生成黑白图 + thresh=deal_license(cutimg) + cv2.imshow('thresh',thresh) + cv2.imwrite("cp.jpg",thresh) + cv2.waitKey(0) + + #分割字符 + ''' + 判断底色和字色 + ''' + #记录黑白像素总和 + white=[] + black=[] + height=thresh.shape[0] #263 + width=thresh.shape[1] #400 + #print('height',height) + #print('width',width) + white_max=0 + black_max=0 + #计算每一列的黑白像素总和 + for i in range(width): + line_white=0 + line_black=0 + for j in range(height): + if thresh[j][i]==255: + line_white+=1 + if thresh[j][i]==0: + line_black+=1 + white_max=max(white_max,line_white) + black_max=max(black_max,line_black) + white.append(line_white) + black.append(line_black) + print('white',white) + print('black',black) + #arg为true表示黑底白字,False为白底黑字 + arg=True + if black_max(0.02*white_max if arg else 0.02*black_max): + start=n + end=find_end(start,arg,black,white,width,black_max,white_max) + n=end + if end-start>5: + cj=thresh[1:height,start:end] + cv2.imshow('cutlicense',cj) + cv2.waitKey(0) + + + cv2.waitKey(0) + cv2.destroyAllWindows() \ No newline at end of file diff --git a/大作业/14.1/car.jpg b/大作业/14.1/car.jpg new file mode 100644 index 0000000..79529bb Binary files /dev/null and b/大作业/14.1/car.jpg differ diff --git a/大作业/14.1/cat.png b/大作业/14.1/cat.png new file mode 100644 index 0000000..5cb557b Binary files /dev/null and b/大作业/14.1/cat.png differ diff --git a/大作业/14.1/cp.jpg b/大作业/14.1/cp.jpg new file mode 100644 index 0000000..aaf3f86 Binary files /dev/null and b/大作业/14.1/cp.jpg differ diff --git a/大作业/14.1/demo1.jpg b/大作业/14.1/demo1.jpg new file mode 100644 index 0000000..15ce478 Binary files /dev/null and b/大作业/14.1/demo1.jpg differ diff --git a/大作业/14.1/demo2.jpg b/大作业/14.1/demo2.jpg new file mode 100644 index 0000000..d12088d Binary files /dev/null and b/大作业/14.1/demo2.jpg differ diff --git a/大作业/14.1/dog.jpg b/大作业/14.1/dog.jpg new file mode 100644 index 0000000..f212d83 Binary files /dev/null and b/大作业/14.1/dog.jpg differ diff --git a/大作业/14.1/img.jpg b/大作业/14.1/img.jpg new file mode 100644 index 0000000..1b1fc03 Binary files /dev/null and b/大作业/14.1/img.jpg differ diff --git a/大作业/14.1/labelmap_det.txt b/大作业/14.1/labelmap_det.txt new file mode 100644 index 0000000..73fcf16 --- /dev/null +++ b/大作业/14.1/labelmap_det.txt @@ -0,0 +1,402 @@ +label: 0 +display_name: "background" +label: 1 +display_name: "accordion" +label: 2 +display_name: "airplane" +label: 3 +display_name: "ant" +label: 4 +display_name: "antelope" +label: 5 +display_name: "apple" +label: 6 +display_name: "armadillo" +label: 7 +display_name: "artichoke" +label: 8 +display_name: "axe" +label: 9 +display_name: "baby_bed" +label: 10 +display_name: "backpack" +label: 11 +display_name: "bagel" +label: 12 +display_name: "balance_beam" +label: 13 +display_name: "banana" +label: 14 +display_name: "band_aid" +label: 15 +display_name: "banjo" +label: 16 +display_name: "baseball" +label: 17 +display_name: "basketball" +label: 18 +display_name: "bathing_cap" +label: 19 +display_name: "beaker" +label: 20 +display_name: "bear" +label: 21 +display_name: "bee" +label: 22 +display_name: "bell_pepper" +label: 23 +display_name: "bench" +label: 24 +display_name: "bicycle" +label: 25 +display_name: "binder" +label: 26 +display_name: "bird" +label: 27 +display_name: "bookshelf" +label: 28 +display_name: "bow_tie" +label: 29 +display_name: "bow" +label: 30 +display_name: "bowl" +label: 31 +display_name: "brassiere" +label: 32 +display_name: "burrito" +label: 33 +display_name: "bus" +label: 34 +display_name: "butterfly" +label: 35 +display_name: "camel" +label: 36 +display_name: "can_opener" +label: 37 +display_name: "car" +label: 38 +display_name: "cart" +label: 39 +display_name: "cattle" +label: 40 +display_name: "cello" +label: 41 +display_name: "centipede" +label: 42 +display_name: "chain_saw" +label: 43 +display_name: "chair" +label: 44 +display_name: "chime" +label: 45 +display_name: "cocktail_shaker" +label: 46 +display_name: "coffee_maker" +label: 47 +display_name: "computer_keyboard" +label: 48 +display_name: "computer_mouse" +label: 49 +display_name: "corkscrew" +label: 50 +display_name: "cream" +label: 51 +display_name: "croquet_ball" +label: 52 +display_name: "crutch" +label: 53 +display_name: "cucumber" +label: 54 +display_name: "cup_or_mug" +label: 55 +display_name: "diaper" +label: 56 +display_name: "digital_clock" +label: 57 +display_name: "dishwasher" +label: 58 +display_name: "dog" +label: 59 +display_name: "domestic_cat" +label: 60 +display_name: "dragonfly" +label: 61 +display_name: "drum" +label: 62 +display_name: "dumbbell" +label: 63 +display_name: "electric_fan" +label: 64 +display_name: "elephant" +label: 65 +display_name: "face_powder" +label: 66 +display_name: "fig" +label: 67 +display_name: "filing_cabinet" +label: 68 +display_name: "flower_ +label: 69 +display_name: "fl +label: 70 +display_name: "fox" +label: 71 +display_name: "french_h +label: 72 +display_name: "frog" +label: 73 +display_name: "frying_ +label: 74 +display_name: "giant_pa +label: 75 +display_name: "goldfish" +label: 76 +display_name: "golf_ball" +label: 77 +display_name: "golfcart" +label: 78 +display_name: "guacamole" +label: 79 +display_name: "guitar" +label: 80 +display_name: "hair_dryer" +label: 81 +display_name: "hair_spray" +label: 82 +display_name: "hamburger" +label: 83 +display_name: "hammer" +label: 84 +display_name: "hamster" +label: 85 +display_name: "harmonica" +label: 86 +display_name: "harp" +label: 87 +display_name: "hat_with_a_wide_brim" +label: 88 +display_name: "head_cabbage" +label: 89 +display_name: "helmet" +label: 90 +display_name: "hippopotamus" +label: 91 +display_name: "horizontal_bar" +label: 92 +display_name: "horse" +label: 93 +display_name: "hotdog" +label: 94 +display_name: "iPod" +label: 95 +display_name: "isopod" +label: 96 +display_name: "jellyfish" +label: 97 +display_name: "koala_bear" +label: 98 +display_name: "ladle" +label: 99 +display_name: "ladybug" +label: 100 +display_name: "lamp" +label: 101 +display_name: "laptop" +label: 102 +display_name: "lemon" +label: 103 +display_name: "lion" +label: 104 +display_name: "lipstick" +label: 105 +display_name: "lizard" +label: 106 +display_name: "lobster" +label: 107 +display_name: "maillot" +label: 108 +display_name: "maraca" +label: 109 +display_name: "microphone" +label: 110 +display_name: "microwave" +label: 111 +display_name: "milk_can" +label: 112 +display_name: "miniskirt" +label: 113 +display_name: "monkey" +label: 114 +display_name: "motorcycle" +label: 115 +display_name: "mushroom" +label: 116 +display_name: "nail" +label: 117 +display_name: "neck_brace" +label: 118 +display_name: "oboe" +label: 119 +display_name: "orange" +label: 120 +display_name: "otter" +label: 121 +display_name: "pencil_box" +label: 122 +display_name: "pencil_sharpener" +label: 123 +display_name: "perfume" +label: 124 +display_name: "person" +label: 125 +display_name: "piano" +label: 126 +display_name: "pineapple" +label: 127 +display_name: "ping-pong_ball" +label: 128 +display_name: "pitcher" +label: 129 +display_name: "pizza" +label: 130 +display_name: "plastic_bag" +label: 131 +display_name: "plate_rack" +label: 132 +display_name: "pomegranate" +label: 133 +display_name: "popsicle" +label: 134 +display_name: "porcupine" +label: 135 +display_name: "power_drill" +label: 136 +display_name: "pretzel" +label: 137 +display_name: "printer" +label: 138 +display_name: "puck" +label: 139 +display_name: "punching_bag" +label: 140 +display_name: "purse" +label: 141 +display_name: "rabbit" +label: 142 +display_name: "racket" +label: 143 +display_name: "ray" +label: 144 +display_name: "red_panda" +label: 145 +display_name: "refrigerator" +label: 146 +display_name: "remote_control" +label: 147 +display_name: "rubber_eraser" +label: 148 +display_name: "rugby_ball" +label: 149 +display_name: "ruler" +label: 150 +display_name: "salt_or_pepper_shaker" +label: 151 +display_name: "saxophone" +label: 152 +display_name: "scorpion" +label: 153 +display_name: "screwdriver" +label: 154 +display_name: "seal" +label: 155 +display_name: "sheep" +label: 156 +display_name: "ski" +label: 157 +display_name: "skunk" +label: 158 +display_name: "snail" +label: 159 +display_name: "snake" +label: 160 +display_name: "snowmobile" +label: 161 +display_name: "snowplow" +label: 162 +display_name: "soap_dispenser" +label: 163 +display_name: "soccer_ball" +label: 164 +display_name: "sofa" +label: 165 +display_name: "spatula" +label: 166 +display_name: "squirrel" +label: 167 +display_name: "starfish" +label: 168 +display_name: "stethoscope" +label: 169 +display_name: "stove" +label: 170 +display_name: "strainer" +label: 171 +display_name: "strawberry" +label: 172 +display_name: "stretcher" +label: 173 +display_name: "sunglasses" +label: 174 +display_name: "swimming_trunks" +label: 175 +display_name: "swine" +label: 176 +display_name: "syringe" +label: 177 +display_name: "table" +label: 178 +display_name: "tape_player" +label: 179 +display_name: "tennis_ball" +label: 180 +display_name: "tick" +label: 181 +display_name: "tie" +label: 182 +display_name: "tiger" +label: 183 +display_name: "toaster" +label: 184 +display_name: "traffic_light" +label: 185 +display_name: "train" +label: 186 +display_name: "trombone" +label: 187 +display_name: "trumpet" +label: 188 +display_name: "turtle" +label: 189 +display_name: "tv_or_monitor" +label: 190 +display_name: "unicycle" +label: 191 +display_name: "vacuum" +label: 192 +display_name: "violin" +label: 193 +display_name: "volleyball" +label: 194 +display_name: "waffle_iron" +label: 195 +display_name: "washer" +label: 196 +display_name: "water_bottle" +label: 197 +display_name: "watercraft" +label: 198 +display_name: "whale" +label: 199 +display_name: "wine_bottle" +label: 200 +display_name: "zebra" \ No newline at end of file diff --git a/大作业/14.1/lena.jpg b/大作业/14.1/lena.jpg new file mode 100644 index 0000000..c7fc570 Binary files /dev/null and b/大作业/14.1/lena.jpg differ diff --git a/大作业/14.1/lena.png b/大作业/14.1/lena.png new file mode 100644 index 0000000..d08b362 Binary files /dev/null and b/大作业/14.1/lena.png differ diff --git a/大作业/14.1/test.jpg b/大作业/14.1/test.jpg new file mode 100644 index 0000000..9afdc80 Binary files /dev/null and b/大作业/14.1/test.jpg differ diff --git a/大作业/14.1/test2.jpg b/大作业/14.1/test2.jpg new file mode 100644 index 0000000..fc6be8b Binary files /dev/null and b/大作业/14.1/test2.jpg differ diff --git a/大作业/14.1/test3.jpg b/大作业/14.1/test3.jpg new file mode 100644 index 0000000..5098d87 Binary files /dev/null and b/大作业/14.1/test3.jpg differ diff --git a/大作业/14.2/14.2.py b/大作业/14.2/14.2.py new file mode 100644 index 0000000..ac131ab --- /dev/null +++ b/大作业/14.2/14.2.py @@ -0,0 +1,55 @@ +import cv2 as cv +from PIL import Image +import pytesseract as tess + + +def recoginse_text(image): + """ + 步骤: + 1、灰度,二值化处理 + 2、形态学操作去噪 + 3、识别 + :param image: + :return: + """ + + # 灰度 二值化 + gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) + # 如果是白底黑字 建议 _INV + ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV| cv.THRESH_OTSU) + + + # 形态学操作 (根据需要设置参数(1,2)) + kernel = cv.getStructuringElement(cv.MORPH_RECT,(1,2)) #去除横向细线 + morph1 = cv.morphologyEx(binary,cv.MORPH_OPEN,kernel) + kernel = cv.getStructuringElement(cv.MORPH_RECT, (2, 1)) #去除纵向细线 + morph2 = cv.morphologyEx(morph1,cv.MORPH_OPEN,kernel) + cv.imshow("Morph",morph2) + + # 黑底白字取非,变为白底黑字(便于pytesseract 识别) + cv.bitwise_not(morph2,morph2) + textImage = Image.fromarray(morph2) + + # 图片转文字 + text=tess.image_to_string(textImage) + n=10 #根据不同国家车牌固定数目进行设置 + print("识别结果:") + print(text[1:n]) + + + +def main(): + # 读取需要识别的数字字母图片,并显示读到的原图 + src = cv.imread("cp.jpg") + cv.imshow("src",src) + + # 识别 + recoginse_text(src) + + cv.waitKey(0) + cv.destroyAllWindows() + +if __name__=="__main__": + main() + + diff --git a/大作业/14.2/car.jpg b/大作业/14.2/car.jpg new file mode 100644 index 0000000..79529bb Binary files /dev/null and b/大作业/14.2/car.jpg differ diff --git a/大作业/14.2/cat.png b/大作业/14.2/cat.png new file mode 100644 index 0000000..5cb557b Binary files /dev/null and b/大作业/14.2/cat.png differ diff --git a/大作业/14.2/cp.jpg b/大作业/14.2/cp.jpg new file mode 100644 index 0000000..aaf3f86 Binary files /dev/null and b/大作业/14.2/cp.jpg differ diff --git a/大作业/14.2/demo1.jpg b/大作业/14.2/demo1.jpg new file mode 100644 index 0000000..15ce478 Binary files /dev/null and b/大作业/14.2/demo1.jpg differ diff --git a/大作业/14.2/demo2.jpg b/大作业/14.2/demo2.jpg new file mode 100644 index 0000000..d12088d Binary files /dev/null and b/大作业/14.2/demo2.jpg differ diff --git a/大作业/14.2/dog.jpg b/大作业/14.2/dog.jpg new file mode 100644 index 0000000..f212d83 Binary files /dev/null and b/大作业/14.2/dog.jpg differ diff --git a/大作业/14.2/img.jpg b/大作业/14.2/img.jpg new file mode 100644 index 0000000..1b1fc03 Binary files /dev/null and b/大作业/14.2/img.jpg differ diff --git a/大作业/14.2/lena.jpg b/大作业/14.2/lena.jpg new file mode 100644 index 0000000..c7fc570 Binary files /dev/null and b/大作业/14.2/lena.jpg differ diff --git a/大作业/14.2/lena.png b/大作业/14.2/lena.png new file mode 100644 index 0000000..d08b362 Binary files /dev/null and b/大作业/14.2/lena.png differ diff --git a/大作业/14.2/tesseract-ocr-w64-setup-v5.0.0-alpha.20210811.exe b/大作业/14.2/tesseract-ocr-w64-setup-v5.0.0-alpha.20210811.exe new file mode 100644 index 0000000..b950bdb Binary files /dev/null and b/大作业/14.2/tesseract-ocr-w64-setup-v5.0.0-alpha.20210811.exe differ diff --git a/大作业/14.2/test.jpg b/大作业/14.2/test.jpg new file mode 100644 index 0000000..9afdc80 Binary files /dev/null and b/大作业/14.2/test.jpg differ diff --git a/大作业/14.2/test.pyproj b/大作业/14.2/test.pyproj new file mode 100644 index 0000000..bd21679 --- /dev/null +++ b/大作业/14.2/test.pyproj @@ -0,0 +1,35 @@ + + + Debug + 2.0 + e85e00fb-959d-4c3b-852b-f88a24227bbc + . + test.py + + + . + . + test + test + + + true + false + + + true + false + + + + + + + + + + + + \ No newline at end of file diff --git a/大作业/14.2/test2.jpg b/大作业/14.2/test2.jpg new file mode 100644 index 0000000..fc6be8b Binary files /dev/null and b/大作业/14.2/test2.jpg differ diff --git a/大作业/14.2/test3.jpg b/大作业/14.2/test3.jpg new file mode 100644 index 0000000..5098d87 Binary files /dev/null and b/大作业/14.2/test3.jpg differ diff --git a/大作业/14.2/test4.jpg b/大作业/14.2/test4.jpg new file mode 100644 index 0000000..ff60e4c Binary files /dev/null and b/大作业/14.2/test4.jpg differ diff --git a/大作业/14.2/thre_res.png b/大作业/14.2/thre_res.png new file mode 100644 index 0000000..3123be1 Binary files /dev/null and b/大作业/14.2/thre_res.png differ diff --git a/大作业/14.3/14.3.py b/大作业/14.3/14.3.py new file mode 100644 index 0000000..197ae53 --- /dev/null +++ b/大作业/14.3/14.3.py @@ -0,0 +1,154 @@ +import tkinter as tk +from tkinter.filedialog import * +from tkinter import ttk +import tkinter.messagebox as mBox + +import predict +import cv2 +from PIL import Image, ImageTk +import threading +import time + + + +class Surface(ttk.Frame): + pic_path = "" + viewhigh = 600 + viewwide = 600 + update_time = 0 + thread = None + thread_run = False + camera = None + color_transform = {"green":("绿牌","#55FF55"), "yello":("黄牌","#FFFF00"), "blue":("蓝牌","#6666FF")} + + def __init__(self, win): + ttk.Frame.__init__(self, win) + frame_left = ttk.Frame(self) + frame_right1 = ttk.Frame(self) + frame_right2 = ttk.Frame(self) + win.title("车牌识别") + win.state("zoomed") + self.pack(fill=tk.BOTH, expand=tk.YES, padx="5", pady="5") + frame_left.pack(side=tk.LEFT,expand=1,fill=tk.BOTH) + frame_right1.pack(side=tk.TOP,expand=1,fill=tk.Y) + frame_right2.pack(side=tk.RIGHT,expand=0) + ttk.Label(frame_left, text='原图:').pack(anchor="nw") + ttk.Label(frame_right1, text='车牌位置:').grid(column=0, row=0, sticky=tk.W) + + from_pic_ctl = ttk.Button(frame_right2, text="来自图片", width=20, command=self.from_pic) + from_vedio_ctl = ttk.Button(frame_right2, text="来自摄像头", width=20, command=self.from_vedio) + self.image_ctl = ttk.Label(frame_left) + self.image_ctl.pack(anchor="nw") + + self.roi_ctl = ttk.Label(frame_right1) + self.roi_ctl.grid(column=0, row=1, sticky=tk.W) + ttk.Label(frame_right1, text='识别结果:').grid(column=0, row=2, sticky=tk.W) + self.r_ctl = ttk.Label(frame_right1, text="") + self.r_ctl.grid(column=0, row=3, sticky=tk.W) + self.color_ctl = ttk.Label(frame_right1, text="", width="20") + self.color_ctl.grid(column=0, row=4, sticky=tk.W) + from_vedio_ctl.pack(anchor="se", pady="5") + from_pic_ctl.pack(anchor="se", pady="5") + self.predictor = predict.CardPredictor() + self.predictor.train_svm() + + def get_imgtk(self, img_bgr): + img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) + im = Image.fromarray(img) + imgtk = ImageTk.PhotoImage(image=im) + wide = imgtk.width() + high = imgtk.height() + if wide > self.viewwide or high > self.viewhigh: + wide_factor = self.viewwide / wide + high_factor = self.viewhigh / high + factor = min(wide_factor, high_factor) + + wide = int(wide * factor) + if wide <= 0 : wide = 1 + high = int(high * factor) + if high <= 0 : high = 1 + im=im.resize((wide, high), Image.LANCZOS) #在pillow的10.0.0版本中,ANTIALIAS方法被删除了,使用新的方法即可: + imgtk = ImageTk.PhotoImage(image=im) + return imgtk + + def show_roi(self, r, roi, color): + if r : + roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB) + roi = Image.fromarray(roi) + self.imgtk_roi = ImageTk.PhotoImage(image=roi) + self.roi_ctl.configure(image=self.imgtk_roi, state='enable') + self.r_ctl.configure(text=str(r)) + self.update_time = time.time() + try: + c = self.color_transform[color] + self.color_ctl.configure(text=c[0], background=c[1], state='enable') + except: + self.color_ctl.configure(state='disabled') + elif self.update_time + 8 < time.time(): + self.roi_ctl.configure(state='disabled') + self.r_ctl.configure(text="") + self.color_ctl.configure(state='disabled') + + def from_vedio(self): + if self.thread_run: + return + if self.camera is None: + self.camera = cv2.VideoCapture(0) + if not self.camera.isOpened(): + mBox.showwarning('警告', '摄像头打开失败!') + self.camera = None + return + self.thread = threading.Thread(target=self.vedio_thread, args=(self,)) + self.thread.setDaemon(True) + self.thread.start() + self.thread_run = True + + def from_pic(self): + self.thread_run = False + self.pic_path = askopenfilename(title="选择识别图片", filetypes=[("jpg图片", "*.jpg")]) + if self.pic_path: + img_bgr = predict.imreadex(self.pic_path) + self.imgtk = self.get_imgtk(img_bgr) + self.image_ctl.configure(image=self.imgtk) + resize_rates = (1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4) + for resize_rate in resize_rates: + print("resize_rate:", resize_rate) + try: + r, roi, color = self.predictor.predict(img_bgr, resize_rate) + except: + continue + if r: + break + #r, roi, color = self.predictor.predict(img_bgr, 1) + self.show_roi(r, roi, color) + + @staticmethod + def vedio_thread(self): + self.thread_run = True + predict_time = time.time() + while self.thread_run: + _, img_bgr = self.camera.read() + self.imgtk = self.get_imgtk(img_bgr) + self.image_ctl.configure(image=self.imgtk) + if time.time() - predict_time > 2: + r, roi, color = self.predictor.predict(img_bgr) + self.show_roi(r, roi, color) + predict_time = time.time() + print("run end") + + +def close_window(): + print("destroy") + if surface.thread_run : + surface.thread_run = False + surface.thread.join(2.0) + win.destroy() + + +if __name__ == '__main__': + win=tk.Tk() + + surface = Surface(win) + win.protocol('WM_DELETE_WINDOW', close_window) + win.mainloop() + diff --git a/大作业/14.3/2.jpg b/大作业/14.3/2.jpg new file mode 100644 index 0000000..8bfdff4 Binary files /dev/null and b/大作业/14.3/2.jpg differ diff --git a/大作业/14.3/car.jpg b/大作业/14.3/car.jpg new file mode 100644 index 0000000..79529bb Binary files /dev/null and b/大作业/14.3/car.jpg differ diff --git a/大作业/14.3/cat.png b/大作业/14.3/cat.png new file mode 100644 index 0000000..5cb557b Binary files /dev/null and b/大作业/14.3/cat.png differ diff --git a/大作业/14.3/config.js b/大作业/14.3/config.js new file mode 100644 index 0000000..26bb789 --- /dev/null +++ b/大作业/14.3/config.js @@ -0,0 +1,20 @@ +{ + "config":[ + { + "open":1, + "blur":3, + "morphologyr":4, + "morphologyc":19, + "col_num_limit":10, + "row_num_limit":21 + }, + { + "open":0, + "blur":3, + "morphologyr":5, + "morphologyc":12, + "col_num_limit":10, + "row_num_limit":18 + } + ] +} \ No newline at end of file diff --git a/大作业/14.3/cp.jpg b/大作业/14.3/cp.jpg new file mode 100644 index 0000000..aaf3f86 Binary files /dev/null and b/大作业/14.3/cp.jpg differ diff --git a/大作业/14.3/demo1.jpg b/大作业/14.3/demo1.jpg new file mode 100644 index 0000000..15ce478 Binary files /dev/null and b/大作业/14.3/demo1.jpg differ diff --git a/大作业/14.3/demo2.jpg b/大作业/14.3/demo2.jpg new file mode 100644 index 0000000..d12088d Binary files /dev/null and b/大作业/14.3/demo2.jpg differ diff --git a/大作业/14.3/dog.jpg b/大作业/14.3/dog.jpg new file mode 100644 index 0000000..f212d83 Binary files /dev/null and b/大作业/14.3/dog.jpg differ diff --git a/大作业/14.3/img.jpg b/大作业/14.3/img.jpg new file mode 100644 index 0000000..1b1fc03 Binary files /dev/null and b/大作业/14.3/img.jpg differ diff --git a/大作业/14.3/labelmap_det.txt b/大作业/14.3/labelmap_det.txt new file mode 100644 index 0000000..73fcf16 --- /dev/null +++ b/大作业/14.3/labelmap_det.txt @@ -0,0 +1,402 @@ +label: 0 +display_name: "background" +label: 1 +display_name: "accordion" +label: 2 +display_name: "airplane" +label: 3 +display_name: "ant" +label: 4 +display_name: "antelope" +label: 5 +display_name: "apple" +label: 6 +display_name: "armadillo" +label: 7 +display_name: "artichoke" +label: 8 +display_name: "axe" +label: 9 +display_name: "baby_bed" +label: 10 +display_name: "backpack" +label: 11 +display_name: "bagel" +label: 12 +display_name: "balance_beam" +label: 13 +display_name: "banana" +label: 14 +display_name: "band_aid" +label: 15 +display_name: "banjo" +label: 16 +display_name: "baseball" +label: 17 +display_name: "basketball" +label: 18 +display_name: "bathing_cap" +label: 19 +display_name: "beaker" +label: 20 +display_name: "bear" +label: 21 +display_name: "bee" +label: 22 +display_name: "bell_pepper" +label: 23 +display_name: "bench" +label: 24 +display_name: "bicycle" +label: 25 +display_name: "binder" +label: 26 +display_name: "bird" +label: 27 +display_name: "bookshelf" +label: 28 +display_name: "bow_tie" +label: 29 +display_name: "bow" +label: 30 +display_name: "bowl" +label: 31 +display_name: "brassiere" +label: 32 +display_name: "burrito" +label: 33 +display_name: "bus" +label: 34 +display_name: "butterfly" +label: 35 +display_name: "camel" +label: 36 +display_name: "can_opener" +label: 37 +display_name: "car" +label: 38 +display_name: "cart" +label: 39 +display_name: "cattle" +label: 40 +display_name: "cello" +label: 41 +display_name: "centipede" +label: 42 +display_name: "chain_saw" +label: 43 +display_name: "chair" +label: 44 +display_name: "chime" +label: 45 +display_name: "cocktail_shaker" +label: 46 +display_name: "coffee_maker" +label: 47 +display_name: "computer_keyboard" +label: 48 +display_name: "computer_mouse" +label: 49 +display_name: "corkscrew" +label: 50 +display_name: "cream" +label: 51 +display_name: "croquet_ball" +label: 52 +display_name: "crutch" +label: 53 +display_name: "cucumber" +label: 54 +display_name: "cup_or_mug" +label: 55 +display_name: "diaper" +label: 56 +display_name: "digital_clock" +label: 57 +display_name: "dishwasher" +label: 58 +display_name: "dog" +label: 59 +display_name: "domestic_cat" +label: 60 +display_name: "dragonfly" +label: 61 +display_name: "drum" +label: 62 +display_name: "dumbbell" +label: 63 +display_name: "electric_fan" +label: 64 +display_name: "elephant" +label: 65 +display_name: "face_powder" +label: 66 +display_name: "fig" +label: 67 +display_name: "filing_cabinet" +label: 68 +display_name: "flower_ +label: 69 +display_name: "fl +label: 70 +display_name: "fox" +label: 71 +display_name: "french_h +label: 72 +display_name: "frog" +label: 73 +display_name: "frying_ +label: 74 +display_name: "giant_pa +label: 75 +display_name: "goldfish" +label: 76 +display_name: "golf_ball" +label: 77 +display_name: "golfcart" +label: 78 +display_name: "guacamole" +label: 79 +display_name: "guitar" +label: 80 +display_name: "hair_dryer" +label: 81 +display_name: "hair_spray" +label: 82 +display_name: "hamburger" +label: 83 +display_name: "hammer" +label: 84 +display_name: "hamster" +label: 85 +display_name: "harmonica" +label: 86 +display_name: "harp" +label: 87 +display_name: "hat_with_a_wide_brim" +label: 88 +display_name: "head_cabbage" +label: 89 +display_name: "helmet" +label: 90 +display_name: "hippopotamus" +label: 91 +display_name: "horizontal_bar" +label: 92 +display_name: "horse" +label: 93 +display_name: "hotdog" +label: 94 +display_name: "iPod" +label: 95 +display_name: "isopod" +label: 96 +display_name: "jellyfish" +label: 97 +display_name: "koala_bear" +label: 98 +display_name: "ladle" +label: 99 +display_name: "ladybug" +label: 100 +display_name: "lamp" +label: 101 +display_name: "laptop" +label: 102 +display_name: "lemon" +label: 103 +display_name: "lion" +label: 104 +display_name: "lipstick" +label: 105 +display_name: "lizard" +label: 106 +display_name: "lobster" +label: 107 +display_name: "maillot" +label: 108 +display_name: "maraca" +label: 109 +display_name: "microphone" +label: 110 +display_name: "microwave" +label: 111 +display_name: "milk_can" +label: 112 +display_name: "miniskirt" +label: 113 +display_name: "monkey" +label: 114 +display_name: "motorcycle" +label: 115 +display_name: "mushroom" +label: 116 +display_name: "nail" +label: 117 +display_name: "neck_brace" +label: 118 +display_name: "oboe" +label: 119 +display_name: "orange" +label: 120 +display_name: "otter" +label: 121 +display_name: "pencil_box" +label: 122 +display_name: "pencil_sharpener" +label: 123 +display_name: "perfume" +label: 124 +display_name: "person" +label: 125 +display_name: "piano" +label: 126 +display_name: "pineapple" +label: 127 +display_name: "ping-pong_ball" +label: 128 +display_name: "pitcher" +label: 129 +display_name: "pizza" +label: 130 +display_name: "plastic_bag" +label: 131 +display_name: "plate_rack" +label: 132 +display_name: "pomegranate" +label: 133 +display_name: "popsicle" +label: 134 +display_name: "porcupine" +label: 135 +display_name: "power_drill" +label: 136 +display_name: "pretzel" +label: 137 +display_name: "printer" +label: 138 +display_name: "puck" +label: 139 +display_name: "punching_bag" +label: 140 +display_name: "purse" +label: 141 +display_name: "rabbit" +label: 142 +display_name: "racket" +label: 143 +display_name: "ray" +label: 144 +display_name: "red_panda" +label: 145 +display_name: "refrigerator" +label: 146 +display_name: "remote_control" +label: 147 +display_name: "rubber_eraser" +label: 148 +display_name: "rugby_ball" +label: 149 +display_name: "ruler" +label: 150 +display_name: "salt_or_pepper_shaker" +label: 151 +display_name: "saxophone" +label: 152 +display_name: "scorpion" +label: 153 +display_name: "screwdriver" +label: 154 +display_name: "seal" +label: 155 +display_name: "sheep" +label: 156 +display_name: "ski" +label: 157 +display_name: "skunk" +label: 158 +display_name: "snail" +label: 159 +display_name: "snake" +label: 160 +display_name: "snowmobile" +label: 161 +display_name: "snowplow" +label: 162 +display_name: "soap_dispenser" +label: 163 +display_name: "soccer_ball" +label: 164 +display_name: "sofa" +label: 165 +display_name: "spatula" +label: 166 +display_name: "squirrel" +label: 167 +display_name: "starfish" +label: 168 +display_name: "stethoscope" +label: 169 +display_name: "stove" +label: 170 +display_name: "strainer" +label: 171 +display_name: "strawberry" +label: 172 +display_name: "stretcher" +label: 173 +display_name: "sunglasses" +label: 174 +display_name: "swimming_trunks" +label: 175 +display_name: "swine" +label: 176 +display_name: "syringe" +label: 177 +display_name: "table" +label: 178 +display_name: "tape_player" +label: 179 +display_name: "tennis_ball" +label: 180 +display_name: "tick" +label: 181 +display_name: "tie" +label: 182 +display_name: "tiger" +label: 183 +display_name: "toaster" +label: 184 +display_name: "traffic_light" +label: 185 +display_name: "train" +label: 186 +display_name: "trombone" +label: 187 +display_name: "trumpet" +label: 188 +display_name: "turtle" +label: 189 +display_name: "tv_or_monitor" +label: 190 +display_name: "unicycle" +label: 191 +display_name: "vacuum" +label: 192 +display_name: "violin" +label: 193 +display_name: "volleyball" +label: 194 +display_name: "waffle_iron" +label: 195 +display_name: "washer" +label: 196 +display_name: "water_bottle" +label: 197 +display_name: "watercraft" +label: 198 +display_name: "whale" +label: 199 +display_name: "wine_bottle" +label: 200 +display_name: "zebra" \ No newline at end of file diff --git a/大作业/14.3/lena.jpg b/大作业/14.3/lena.jpg new file mode 100644 index 0000000..5c735f0 Binary files /dev/null and b/大作业/14.3/lena.jpg differ diff --git a/大作业/requirements.txt b/大作业/requirements.txt new file mode 100644 index 0000000..cc3605b --- /dev/null +++ b/大作业/requirements.txt @@ -0,0 +1,4 @@ +opencv-python~=4.10.0.84 +numpy~=1.21.6 +pytesseract~=0.3.10 +pillow~=9.5.0 \ No newline at end of file