水平定位图像中的对象
Orienting an Object in an image horizontally
我有各种角度的食物托盘图片。我想让所有托盘水平放置。为此,我尝试使用霍夫变换找到托盘的最长边缘,并计算其相对于图像边界的方向并旋转它。它适用于极少数情况。我想让它适用于我拥有的所有图像。谁能帮我解决这个问题?我在下面的 link 中附上了一些示例图像,并且还包含了我当前正在使用的代码。
Link for images
def Enquiry(lis1):
return(np.array(lis1))
img = cv2.imread('path/to/image')
canny = cv.Canny(img, 100, 200)
minLineLength = 200
maxLineGap = 10
lines = cv.HoughLinesP(canny, 1, np.pi / 180, 100, minLineLength, maxLineGap)
if Enquiry(lines).size>=4:
lines1 = lines[:,0,:]
max_length = 0
index = 0
i = 0
for x1, y1, x2, y2 in lines1:
length = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)
if length > max_length:
max_length = length
index = i
i += 1
[x1,y1,x2,y2]=lines1[index]
degree = math.atan(abs(y1-y2)/abs(x1-x2))
angle = degree*180/np.pi
H, W = img.shape[:2]
rotation_matrix = cv.getRotationMatrix2D((W/2, H/2), -angle, 1)
img_rotation = cv.warpAffine(img, rotation_matrix, (W, H))
cv2.imwrite('rotated_image.jpg', img_rotation)
只有轮换是没有用的。在您的测试图像中,托盘也有一些剪切和倾斜。
我的建议是从直线的交点处找到角点。
至少3个角。然后找到托盘的角和预期的实际角之间的仿射变换。
我有各种角度的食物托盘图片。我想让所有托盘水平放置。为此,我尝试使用霍夫变换找到托盘的最长边缘,并计算其相对于图像边界的方向并旋转它。它适用于极少数情况。我想让它适用于我拥有的所有图像。谁能帮我解决这个问题?我在下面的 link 中附上了一些示例图像,并且还包含了我当前正在使用的代码。 Link for images
def Enquiry(lis1):
return(np.array(lis1))
img = cv2.imread('path/to/image')
canny = cv.Canny(img, 100, 200)
minLineLength = 200
maxLineGap = 10
lines = cv.HoughLinesP(canny, 1, np.pi / 180, 100, minLineLength, maxLineGap)
if Enquiry(lines).size>=4:
lines1 = lines[:,0,:]
max_length = 0
index = 0
i = 0
for x1, y1, x2, y2 in lines1:
length = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)
if length > max_length:
max_length = length
index = i
i += 1
[x1,y1,x2,y2]=lines1[index]
degree = math.atan(abs(y1-y2)/abs(x1-x2))
angle = degree*180/np.pi
H, W = img.shape[:2]
rotation_matrix = cv.getRotationMatrix2D((W/2, H/2), -angle, 1)
img_rotation = cv.warpAffine(img, rotation_matrix, (W, H))
cv2.imwrite('rotated_image.jpg', img_rotation)
只有轮换是没有用的。在您的测试图像中,托盘也有一些剪切和倾斜。
我的建议是从直线的交点处找到角点。 至少3个角。然后找到托盘的角和预期的实际角之间的仿射变换。