我正在尝试编写一个看起来像这样的缩放功能:
centre = ((im.width-1)/2, (im.height-1)/2)
width = int(im.width/(2.0*level))
height = int(im.height/(2.0*level))
rect = (centre[0]-width, centre[1]-height, width*2, height*2)
dst = cv.GetSubRect(im, rect)
cv.Resize(dst, im)
当我完全使用上面所写的内容时,我得到一个奇怪的结果,结果图像的下半部分是扭曲和模糊的。但是当我用
替换行cv.Resize(dst, im)
时
size = cv.CloneImage(im)
cv.Resize(dst, size)
im = size
它工作正常。为什么是这样?我执行缩放的方式有什么根本性的错误吗?
答案 0 :(得分:3)
cv.Resize要求源和目标是独立的内存位置。
现在,在代码的第一个片段中,您正在使用cv.GetSubRect生成一个指向您希望放大的图像区域的对象。这里新对象不指向新的内存位置。它指向一个内存位置,它是原始对象的子集。
由于cv.Resize要求两个内存位置不同,所以你得到的是未定义行为的结果。
在代码的第二部分中,您使用cv.CloneImage来满足此条件。 你是第一次创建im的副本(即大小。但是你可以使用空白图像)然后你使用cv.Resize来调整dst的大小并将结果图像写成大小。
我的建议是在使用它们之前通过函数documentation。