import numpy as np
import os
import cv2 as cv
def put_img_center(img):
h,w,_ = img.shape
background = np.zeros((3*h,3*w,3),dtype=np.uint8)
background [h:2*h,w:2*w] = img
return background
# cv.imshow("1",background)
# cv.waitKey()
# cv.destroyAllWindows()
# # background[]
def fit_line(img_path):
img = cv.imread(img_path)
#把图片放到中心
img = put_img_center(img)
#变成灰度图像才能进行阈值处理并获得二值数据
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,80,255,cv.THRESH_BINARY)
cv.imshow("11",binary)
cv.waitKey()
#获得轮廓
contours,image = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
#得到最大的轮廓下标
area=[]
for cont in contours:
area.append(cv.contourArea(cont))
area =np.array(area)
max_index = np.argmax(area)
#line_fit
rows,cols = img.shape[:2]
#点斜式 vy/vx = k (x,y)是直线上一点 fitline函数一般是把图像按照直线均等的分成两半,所以如果是三角形的话就是三角形的高?
[vx,vy,x,y] = cv.fitLine(contours[max_index],cv.DIST_L2,0,0.01,0.01)
#公式计算
b = (y - (vy/vx)*x)
k = vy/vx
up_point = ( int((-b/k)) ,0 )
down_point = ( int( (cols-1-b)/(k) ),cols-1)
cv.line(img,up_point,down_point,(0,255,0),2)
cv.imshow("1",img)
cv.waitKey()
cv.destroyAllWindows()
fit_line
最新推荐文章于 2024-09-14 14:00:00 发布