画像中から四角を見つけ、四角形を新しい画像に書くことをしたかったのです。
→
こういうことです。
#!/usr/bin/python
# -*- coding:utf-8 -*-
#import tesseract
import os,sys,re,cv,cv2
import numpy as np
imgFile = sys.argv[1]
argc = len(imgFile)
colorImage = cv2.imread(imgFile)
(hi, wi, di) = colorImage.shape
size = hi*wi
im_gray = cv2.cvtColor(colorImage,cv2.COLOR_BGR2GRAY)
kernel = np.ones((2,2),np.uint8)
debuImage = cv2.erode(im_gray,kernel,iterations = 1)
minArea = 200
ret,thresh = cv2.threshold(debuImage, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_TC89_L1)
out_square = 0
real_square = []
for cnt in contours:
cnt_len = cv2.arcLength(cnt, True)#領域を囲む周囲長を調べるtrueが輪郭が閉じているを示す
cnt = cv2.approxPolyDP(cnt, 0.03*cnt_len, True)
if len(cnt) != 4 or cv2.contourArea(cnt) < minArea or not cv2.isContourConvex(cnt): continue
for cnt_x in range(cnt[0][0][0]-3,cnt[0][0][0]+3,1):
if cnt_x == cnt[3][0][0]:
for cnt_y in range(cnt[0][0][1]-3,cnt[0][0][1]+3,1):
if cnt_y == cnt[1][0][1]:
for cnt_x2 in range(cnt[2][0][0]-3,cnt[2][0][0]+3,1):
if cnt_x2 == cnt[1][0][0]:
for cnt_y2 in range(cnt[2][0][1]-3,cnt[2][0][1]+3,1):
if cnt_y2 == cnt[3][0][1]:
real_square.append(cnt)
new_img = np.zeros((hi, wi, di), np.uint8)
new_img[:] = [255, 255, 255]
cv2.drawContours(new_img, real_square, -1, (0, 0, 255), 2)
cv2.imshow("aka",new_img)
cv2.waitKey()
# -*- coding:utf-8 -*-
#import tesseract
import os,sys,re,cv,cv2
import numpy as np
imgFile = sys.argv[1]
argc = len(imgFile)
colorImage = cv2.imread(imgFile)
(hi, wi, di) = colorImage.shape
size = hi*wi
im_gray = cv2.cvtColor(colorImage,cv2.COLOR_BGR2GRAY)
kernel = np.ones((2,2),np.uint8)
debuImage = cv2.erode(im_gray,kernel,iterations = 1)
minArea = 200
ret,thresh = cv2.threshold(debuImage, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_TC89_L1)
out_square = 0
real_square = []
for cnt in contours:
cnt_len = cv2.arcLength(cnt, True)#領域を囲む周囲長を調べるtrueが輪郭が閉じているを示す
cnt = cv2.approxPolyDP(cnt, 0.03*cnt_len, True)
if len(cnt) != 4 or cv2.contourArea(cnt) < minArea or not cv2.isContourConvex(cnt): continue
for cnt_x in range(cnt[0][0][0]-3,cnt[0][0][0]+3,1):
if cnt_x == cnt[3][0][0]:
for cnt_y in range(cnt[0][0][1]-3,cnt[0][0][1]+3,1):
if cnt_y == cnt[1][0][1]:
for cnt_x2 in range(cnt[2][0][0]-3,cnt[2][0][0]+3,1):
if cnt_x2 == cnt[1][0][0]:
for cnt_y2 in range(cnt[2][0][1]-3,cnt[2][0][1]+3,1):
if cnt_y2 == cnt[3][0][1]:
real_square.append(cnt)
new_img = np.zeros((hi, wi, di), np.uint8)
new_img[:] = [255, 255, 255]
cv2.drawContours(new_img, real_square, -1, (0, 0, 255), 2)
cv2.imshow("aka",new_img)
cv2.waitKey()
if len(cnt) != 4 or cv2.contourArea(cnt) < minArea or not cv2.isContourConvex(cnt): continue
ここで、4点で作られてない or 小さすぎる or へこんでいない があればコンテニューして除外するようにしてます。
for cnt_x in range(cnt[0][0][0]-3,cnt[0][0][0]+3,1):
if cnt_x == cnt[3][0][0]:
for cnt_y in range(cnt[0][0][1]-3,cnt[0][0][1]+3,1):
if cnt_y == cnt[1][0][1]:
for cnt_x2 in range(cnt[2][0][0]-3,cnt[2][0][0]+3,1):
if cnt_x2 == cnt[1][0][0]:
for cnt_y2 in range(cnt[2][0][1]-3,cnt[2][0][1]+3,1):
if cnt_y2 == cnt[3][0][1]:
real_square.append(cnt)
if cnt_x == cnt[3][0][0]:
for cnt_y in range(cnt[0][0][1]-3,cnt[0][0][1]+3,1):
if cnt_y == cnt[1][0][1]:
for cnt_x2 in range(cnt[2][0][0]-3,cnt[2][0][0]+3,1):
if cnt_x2 == cnt[1][0][0]:
for cnt_y2 in range(cnt[2][0][1]-3,cnt[2][0][1]+3,1):
if cnt_y2 == cnt[3][0][1]:
real_square.append(cnt)
findContourで取得したら下の図のようになっているので
左上と右上、左下と右下のy座標
左上と左下、右上と右下のx座標が同じだったら四角とみなすと書いてます。
ここ本当に頭悪いな。。。
new_img = np.zeros((hi, wi, di), np.uint8)
new_img[:] = [255, 255, 255]
new_img[:] = [255, 255, 255]
これで、同じサイズの画像を作り。色を白で塗りつぶして新しい画像を作って
この画像に取得した新しい四角を書き込むことにしています。