在实际应用中,经常需要将图像按比例缩放,比如我们在进行目标检测的时候,将输入图像的大小按照一定比例缩放成,常见图像大小:416、448、480、512、608、640等,然后进行预测,并返回预测结果,其中包括目标所在的位置bbox(xmin,ymin,xmax,ymax),但我们需要在原图中进行绘制目标框,所以这里需要一个缩放因子,来进行实现缩放前后的坐标转换。
import cv2
imgpath="img/240.jpg"
img=cv2.imread(imgpath)
print(img.shape)
#目标框的位置
(xmin,ymin,xmax,ymax)=(800,100,1100,700)
cv2.rectangle(img,(xmin,ymin),(xmax,ymax),(255,0,0),2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#输出结果:(H,W,C)
(800, 1200, 3)
下面我们演示一下把原图像按比例缩放到608,并在保持目标框的位置相对不变。
实现代码:
import cv2
imgpath="img/240.jpg"
img=cv2.imread(imgpath)
print(img.shape)
#目标框的位置
(xmin,ymin,xmax,ymax)=(800,100,1100,700)
cv2.rectangle(img,(xmin,ymin),(xmax,ymax),(255,0,0),2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def resize_img(img,size=608):
#计算缩放比例
scale_x= size/ img.shape[1]
scale_y = size/ img.shape[0]
img=cv2.resize(img,None,None,fx=scale_x,fy=scale_y)
return scale_x,scale_y,img
#缩放图片
sx,sy,dstimg=resize_img(img,608)
print(sx,sy,dstimg.shape)
#计算图像缩放后目标框的位置
(xmin,xmax)=(int(xmin*sx),int(xmax*sx))
(ymin,ymax)=(int(ymin*sy),int(ymax*sy))
#画目标框
cv2.rectangle(dstimg,(xmin,ymin),(xmax,ymax),(0,255,0),2)
cv2.imshow("img",dstimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
从运行的结果来看,目标框在缩放前后,都是框住图中的目标对象(person),从而可以实现输入图像与实际图像大小一致的情况下,能准确框住目标对象。
本文暂时没有评论,来添加一个吧(●'◡'●)