我想扭曲图像的子部分以将其投影到不均匀的表面上。最终,我想扭曲这里看到的图像,有点像在这个项目中在HERE中完成的。
我的问题是当我将转换应用于图像的每个子部分时,事情只是没有对齐
这是我实现转换然后缝合的过程(将它们裁剪并粘贴到最终图像上。
- 获取所有点的列表
- 从一组 4 个点创建一个四边形感兴趣区域 (ROI)
这 4 个点用于将图像与相应的原始 4 个点进行变换。这是使用我的名为 perspective_transform() 的函数完成的
一个。我取了 2 组 4 点并将它们传递给 M = cv2.getPerspectiveTransform(corners, newCorners)
湾。然后我调用: warped = cv2.warpPerspective(roi, M, (width, height))
在获得新的扭曲图像后,我使用蒙版根据相关的 ROI 将所有内容拼接在一起:
一个。这是由函数 quadr_croped() 完成的
初始化屏幕以从屏幕获取原始像素,将其保存到 Numpy 数组
img0 = np.array(sct.grab(monitor)) clone = img0.copy() total_height, total_width, channels = img0.shape xSub =int (input("How many columns would you like to divide the screen in to? (integers only)")) ySub =int (input("How many rows would you like to divide the screen in to? (integers only)")) roi_width = float(total_width/xSub) roi_height = float(total_height/ySub) point_list = []
第三:使用2组4个点来扭曲图像的透视
def perspective_transform(图像,投资回报率,角,新角,i = -1):
corners = list (corners) newCorners = list (newCorners) height, width, pixType = image.shape corners = np.array([[corners[0][0],corners[0][1],corners[0][2],corners[0][3]]],np.float32) newCorners = np.array([[newCorners[0][0],newCorners[0][1],newCorners[0][2],newCorners[0][3]]],np.float32) M = cv2.getPerspectiveTransform(corners, newCorners) #warped = cv2.warpPerspective(roi, M, (width, height), flags=cv2.INTER_LINEAR) warped = cv2.warpPerspective(roi, M, (width, height)) return warped
第二:将四边形剪切并粘贴到主图像中
def quadr_croped (mainImg,image, pts, i): #例子
# mask defaulting to black for 3-channel and transparent for 4-channel # (of course replace corners with yours) mask = np.zeros(image.shape, dtype=np.uint8) roi_corners = pts #np.array([[(10,10), (300,300), (10,300)]], dtype=np.int32) # fill the ROI so it doesn't get wiped out when the mask is applied channel_count = image.shape[2] # i.e. 3 or 4 depending on your image ignore_mask_color = (255,)*channel_count cv2.fillConvexPoly(mask, roi_corners, ignore_mask_color) # apply the mask masked_image = cv2.bitwise_and(image, mask) mainImg = cv2.bitwise_or(mainImg, mask) mainImg = mainImg + masked_image # cv2.imshow("debug: image, mainImg: " +str(i), mainImg) return mainImg
第一:启动功能
def draw_quadr(img1):
#set up list for ROIquadrilateral == polygon with 4 sides numb_ROI = xSub * ySub skips =int((numb_ROI-1)/xSub) numb_ROI = skips + numb_ROI quadrilateral_list.clear() for i in range(numb_ROI): if not point_list[i][0] <= point_list[(i+xSub+2)][0]: continue vert_poly = np.array([[ point_list[i], point_list[i+1], point_list[i+xSub+2], point_list[i+xSub+1] ]], dtype=np.int32) verticesPoly_old = np.array([[ H_points_list[i], H_points_list[i+1], H_points_list[i+xSub+2], H_points_list[i+xSub+1] ]], dtype=np.int32) roi = img0.copy() # cv2.imshow("debug: roi"+str(i), roi) overlay = perspective_transform( img1, roi, verticesPoly_old, vert_poly, i) img1 = quadr_croped(img1,overlay,vert_poly,i) cv2.polylines(img1,vert_poly,True,(255,255,0)) quadrilateral_list.append(vert_poly) pt1 = point_list[i] pt2 = point_list[i+xSub+2] cntPt = (int( (pt1[0]+pt2[0])/2),int((pt1[1]+pt2[1])/2) ) cv2.putText(img1,str(len(quadrilateral_list)-1),cntPt,cv2.FONT_HERSHEY_SIMPLEX, 1,(0,255,0),2,cv2.LINE_AA) #cv2.imshow(str(i), img1) return img1
图片结果链接
请看这些,因为它们很好地显示了问题。
无失真的原始图像
此图像与中心有一个左偏移(没有 y 方向移动)
x方向畸变图像的结果
此图像从中心向上偏移(没有 x 方向移动)
y方向畸变图像的结果
此图像从中心向上和向左偏移
x 和 y 方向失真图像的结果
我是计算机视觉和 stackoverflow 的新手,我希望我已经包含了所有内容来帮助描述问题,如果您需要知道其他任何帮助,请告诉我