You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.8 KiB
Python
131 lines
4.8 KiB
Python
#coding=utf-8
|
|
import cv2
|
|
import numpy as np
|
|
|
|
|
|
from . import niblack_thresholding as nt
|
|
|
|
from . import deskew
|
|
|
|
def fitLine_ransac(pts,zero_add = 0 ):
|
|
if len(pts)>=2:
|
|
[vx, vy, x, y] = cv2.fitLine(pts, cv2.DIST_HUBER, 0, 0.01, 0.01)
|
|
lefty = int((-x * vy / vx) + y)
|
|
righty = int(((136- x) * vy / vx) + y)
|
|
return lefty+30+zero_add,righty+30+zero_add
|
|
return 0,0
|
|
|
|
|
|
|
|
#精定位算法
|
|
def findContoursAndDrawBoundingBox(image_rgb):
|
|
|
|
|
|
line_upper = [];
|
|
line_lower = [];
|
|
|
|
line_experiment = []
|
|
grouped_rects = []
|
|
gray_image = cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)
|
|
|
|
# for k in np.linspace(-1.5, -0.2,10):
|
|
for k in np.linspace(-50, 0, 15):
|
|
|
|
# thresh_niblack = threshold_niblack(gray_image, window_size=21, k=k)
|
|
# binary_niblack = gray_image > thresh_niblack
|
|
# binary_niblack = binary_niblack.astype(np.uint8) * 255
|
|
|
|
binary_niblack = cv2.adaptiveThreshold(gray_image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,17,k)
|
|
# cv2.imshow("image1",binary_niblack)
|
|
# cv2.waitKey(0)
|
|
imagex, contours, hierarchy = cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
|
|
for contour in contours:
|
|
bdbox = cv2.boundingRect(contour)
|
|
if (bdbox[3]/float(bdbox[2])>0.7 and bdbox[3]*bdbox[2]>100 and bdbox[3]*bdbox[2]<1200) or (bdbox[3]/float(bdbox[2])>3 and bdbox[3]*bdbox[2]<100):
|
|
# cv2.rectangle(rgb,(bdbox[0],bdbox[1]),(bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]),(255,0,0),1)
|
|
line_upper.append([bdbox[0],bdbox[1]])
|
|
line_lower.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])
|
|
|
|
line_experiment.append([bdbox[0],bdbox[1]])
|
|
line_experiment.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])
|
|
# grouped_rects.append(bdbox)
|
|
|
|
rgb = cv2.copyMakeBorder(image_rgb,30,30,0,0,cv2.BORDER_REPLICATE)
|
|
leftyA, rightyA = fitLine_ransac(np.array(line_lower),3)
|
|
rows,cols = rgb.shape[:2]
|
|
|
|
# rgb = cv2.line(rgb, (cols - 1, rightyA), (0, leftyA), (0, 0, 255), 1,cv2.LINE_AA)
|
|
|
|
leftyB, rightyB = fitLine_ransac(np.array(line_upper),-3)
|
|
|
|
rows,cols = rgb.shape[:2]
|
|
|
|
# rgb = cv2.line(rgb, (cols - 1, rightyB), (0, leftyB), (0,255, 0), 1,cv2.LINE_AA)
|
|
pts_map1 = np.float32([[cols - 1, rightyA], [0, leftyA],[cols - 1, rightyB], [0, leftyB]])
|
|
pts_map2 = np.float32([[136,36],[0,36],[136,0],[0,0]])
|
|
mat = cv2.getPerspectiveTransform(pts_map1,pts_map2)
|
|
image = cv2.warpPerspective(rgb,mat,(136,36),flags=cv2.INTER_CUBIC)
|
|
image,M = deskew.fastDeskew(image)
|
|
|
|
return image
|
|
|
|
|
|
|
|
#多级
|
|
def findContoursAndDrawBoundingBox2(image_rgb):
|
|
|
|
|
|
line_upper = [];
|
|
line_lower = [];
|
|
|
|
line_experiment = []
|
|
|
|
grouped_rects = []
|
|
|
|
gray_image = cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)
|
|
|
|
for k in np.linspace(-1.6, -0.2,10):
|
|
# for k in np.linspace(-15, 0, 15):
|
|
# #
|
|
# thresh_niblack = threshold_niblack(gray_image, window_size=21, k=k)
|
|
# binary_niblack = gray_image > thresh_niblack
|
|
# binary_niblack = binary_niblack.astype(np.uint8) * 255
|
|
|
|
binary_niblack = nt.niBlackThreshold(gray_image,19,k)
|
|
# cv2.imshow("binary_niblack_opencv",binary_niblack_)
|
|
# cv2.imshow("binary_niblack_skimage", binary_niblack)
|
|
|
|
# cv2.waitKey(0)
|
|
imagex, contours, hierarchy = cv2.findContours(binary_niblack.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
|
|
|
|
for contour in contours:
|
|
bdbox = cv2.boundingRect(contour)
|
|
if (bdbox[3]/float(bdbox[2])>0.7 and bdbox[3]*bdbox[2]>100 and bdbox[3]*bdbox[2]<1000) or (bdbox[3]/float(bdbox[2])>3 and bdbox[3]*bdbox[2]<100):
|
|
# cv2.rectangle(rgb,(bdbox[0],bdbox[1]),(bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]),(255,0,0),1)
|
|
line_upper.append([bdbox[0],bdbox[1]])
|
|
line_lower.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])
|
|
|
|
line_experiment.append([bdbox[0],bdbox[1]])
|
|
line_experiment.append([bdbox[0]+bdbox[2],bdbox[1]+bdbox[3]])
|
|
# grouped_rects.append(bdbox)
|
|
|
|
rgb = cv2.copyMakeBorder(image_rgb,30,30,0,0,cv2.BORDER_REPLICATE)
|
|
leftyA, rightyA = fitLine_ransac(np.array(line_lower),2)
|
|
rows,cols = rgb.shape[:2]
|
|
|
|
# rgb = cv2.line(rgb, (cols - 1, rightyA), (0, leftyA), (0, 0, 255), 1,cv2.LINE_AA)
|
|
|
|
leftyB, rightyB = fitLine_ransac(np.array(line_upper),-4)
|
|
|
|
rows,cols = rgb.shape[:2]
|
|
|
|
# rgb = cv2.line(rgb, (cols - 1, rightyB), (0, leftyB), (0,255, 0), 1,cv2.LINE_AA)
|
|
pts_map1 = np.float32([[cols - 1, rightyA], [0, leftyA],[cols - 1, rightyB], [0, leftyB]])
|
|
pts_map2 = np.float32([[136,36],[0,36],[136,0],[0,0]])
|
|
mat = cv2.getPerspectiveTransform(pts_map1,pts_map2)
|
|
image = cv2.warpPerspective(rgb,mat,(136,36),flags=cv2.INTER_CUBIC)
|
|
image,M= deskew.fastDeskew(image)
|
|
|
|
|
|
return image
|