質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

3870閲覧

近い点どうしを結合したい

next_aaa

総合スコア8

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2017/12/18 06:10

pythonで文字領域を求めるプログラムを作りたいのですが文字の重心を求め、その重心の距離が近いとその2点を結合して・・・と進め最終的には文字領域を検出するプログラムを作りたいと思っています。ある距離より近くなったらその2点を結合してとやりたいのですが詳しく教えて頂けませんでしょうか。また、ランダムフォレストを用いるのですがランダムフォレストも教えて頂けると嬉しいです。

# 二値化 def area(): files = os.listdir('C:\Users\LSL\file\opicture') print(files) length=len(files)-1 allw=[] for i in range(length): filename=files[i] logfilename="opicture/"+filename #logfilename="input.png" img2=cv2.imread(logfilename) img3=cv2.cvtColor(img2,cv2.COLOR_BGR2HSV) # 面積(white) hsv_min = np.array([0, 0, 255]) hsv_max = np.array([0, 0, 255]) mask = cv2.inRange(img3, hsv_min, hsv_max) white= cv2.countNonZero(mask) total=mask.shape[0]*mask.shape[1] black=total-white # 白の面積が黒の面積より広い場合は再度白黒を反転する if white>black: mask2=cv2.bitwise_not(img2) name2= mask2.copy() t = 127 name2[mask2 < t] = 0 name2[mask2 >= t] = 255 os.remove(logfilename) cv2.imwrite(logfilename, name2) pre=black black=white white=pre a=[total,white] allw.append(a) else: a=[filename,total,white] allw.append(a) return allw # 周囲長(permister) def perimister (): files = os.listdir('C:\Users\LSL\file\opicture') length=len(files)-1 allw=[] for i in range(length): filename=files[i] logfilename="opicture/"+filename #logfilename="input.png" print(logfilename) img2=cv2.imread(logfilename) img3=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(img3,127,255,0) #cv2.imshow("th",thresh) imgEdge,contours,hierarchy = cv2.findContours(thresh, 1, 2) imgEdge,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) imagecounter1 = np.copy(img2) min_coin_area =0.1 large_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_coin_area] img4=cv2.drawContours( imagecounter1, large_contours, -1, (0,0,255),1) outputfn="opicture2/"+"out2putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img4) warea=0 permister=0 for contour in large_contours: area = cv2.contourArea(contour) per=cv2.arcLength(contour,True) warea+=area permister+=per imagecounter2 = np.copy(img2) imagecounter8 = np.copy(img2) acx=0 acy=0 a=[] print(large_contours) # 重心 for contour in large_contours: M = cv2.moments(contour) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) img12=cv2.circle(imagecounter2, (cx,cy), 3,(0,0,255), -1) ab=[cx,cy] a.append(ab) acx+=cx acy+=cy acx=int(acx/len(large_contours)) acy=int(acy/len(large_contours)) img10=cv2.circle(imagecounter8, (acx,acy),1,(0,255,0), 2) outputfn="opicture2/"+"Mout10putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img10) outputfn="opicture2/"+"Mout5putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img12) print(a) imagecounter2 = np.copy(img2) j=0 print(len(a)) zyusin=[] ar=[0] while 1: try1=a[j] x=try1[0] y=try1[1] w=1 arc=[] #ar.remove(j) while 1: if any(w==arr for arr in ar ): True try: try2=a[w+j] x2=try2[0] y2=try2[1] cx=abs(x-x2) cy=abs(y-y2) root=math.sqrt((cx*cx)+(cy*cy)) print("-------------") print(j) print(w+j) print(root) print("-------------") if root<=20: print("a") ar.append(w) arc.append([x2,y2]) print(arc) w+=1; if root>20: w+=1 except IndexError: print(arc) start=try1 while 1: try: a1=random.choice(arc) arc.remove(a1) except IndexError: zyu=[try1[0],try1[1]] zyusin.append(zyu) break; try: a2=random.choice(arc) arc.remove(a2) acx=(a1[0]+a2[0]+start[0])/3 acy=(a1[1]+a2[1]+start[1])/3 start=[acx,acy] except IndexError: x=(a1[0]+try1[0])/2 y=(a1[1]+try1[1])/2 zyu=[x,y] print(zyu) zyusin.append(zyu) break; if len(arc)==0: zyu=[acx,acy] zyusin.append(zyu) print(zyu) break; j+=1 break ; if j>=len(a): break; print(zyusin) for r in range(len(zyusin)): x=int(zyusin[r][0]) y=int(zyusin[r][1]) img11=cv2.circle(imagecounter2, (x,y), 4,(200,200,200), 2, 4) outputfn="opicture2/"+"Mout32putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img11) #sys.exit() # 回転を考慮しない外接矩形(辺長、面積) imagecounter2 = np.copy(img2) aarea=0 per1=0 print("---------------") for contour in large_contours: x, y, w, h = cv2.boundingRect(contour) aarea=aarea+(w*h) per1=per1+(2*w+2*h) img5=cv2.rectangle(imagecounter2 , (x, y), (x + w, y + h), (0, 255, 0), 1) percent=warea/aarea outputfn="opicture3/"+"out2putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img5) # 回転を考慮した外接矩形 imagecounter3 = np.copy(img2) for contour in large_contours: rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) box = np.int0(box) img6 = cv2.drawContours(imagecounter3,[box],0,(255,0,0),3) outputfn="opicture4/"+"out3putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img6) # 外接円の円周の長さと面積(permister2、menseki3) imagecounter4 = np.copy(img2) permister2=0 menseki3=0 for contour in large_contours: (x,y),radius = cv2.minEnclosingCircle(contour) center = (int(x),int(y)) radius = int(radius) permister2=permister2+(2*radius*math.pi) menseki3=menseki3+(radius*radius*math.pi) img7= cv2.circle( imagecounter4,center,radius,(0,255,0),2) outputfn="opicture5/"+"out3putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img7) # 最小凸包の端点数(toppou) imagecounter1 = np.copy(img2) toppou=0 for contour in large_contours: epsilon = 0.01*cv2.arcLength(contour,True) approx= cv2.approxPolyDP(contour,epsilon,True) toppou=toppou+len(approx) img8=cv2.drawContours(imagecounter1 , [approx], -1, (0, 255, 0), 2) outputfn="opicture6/"+"out3putpic"+str(i)+".jpg" cv2.imwrite(outputfn,img8) # [文字の面積、周囲長、外接矩形の辺長、面積、外接矩形の面積に対する文字の面積の割合、 # 最小凸包の端点数、外接円の円周の長さ、面積] allw.append([warea,permister,per1,aarea,percent,toppou,permister2,menseki3]) return allw if __name__ == "__main__": loadfile() allw=area() allw2=perimister () print(allw2)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問