use*_*956 6 python opencv opencv3.0
s1 = image.shape # Image is an opencv2 image (ndarray)
w,h,d = s1
image_ = cv2.resize(image, (w*2, h*2), interpolation = cv2.INTER_CUBIC)
s2 = image_.shape
Run Code Online (Sandbox Code Playgroud)
在上面,我要求将输出大小调整为 (960,1280),但我得到 (1280, 960)。
那是怎么回事?
image_ = cv2.resize(image, None, fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
Run Code Online (Sandbox Code Playgroud)
...按预期工作。(没有必要指出这一点)。
可运行示例:
import cv2
def run():
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read() # (480, 640, 3)
if not success:
print("Ignoring empty camera frame.")
continue
s1 = image.shape
w, h, d = s1
s2 = (w * 2, h * 2)
image_ = cv2.resize(image, s2, interpolation=cv2.INTER_CUBIC)
s3 = image_.shape
cv2.imshow('Camera',
image_
)
key = cv2.waitKey(5)
if key & 0xFF == 27:
break
cap.release()
if __name__ == '__main__':
run()
Run Code Online (Sandbox Code Playgroud)
基于 OpenCV 文档:
img.shape 返回(高度、宽度、通道数),其中
- 高度表示图像中的像素行数或>图像数组的每列中的像素数
- 宽度表示图像中的像素列数或图像阵列的每行中的像素数。
- 通道数表示用于表示每个像素的分量的数量。
所以调整大小opencv应该像这样发生:
import cv2
cap = cv2.VideoCapture(0)
_, img = cap.read()
cap.release()
print('Original Dimensions : ',img.shape)
scale_percent = 60 # percent of original size
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
dim = (width, height)
# resize image
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)
Run Code Online (Sandbox Code Playgroud)
您的问题是关于为什么fx=2, fy=2根据此链接按预期工作,当没有给出所需的尺寸时,它会根据fx并fy计算所需的尺寸来计算新尺寸:
(double)dsize.width/image.cols(double)dsize.height/image.rows总而言之,我想这是因为在OpenCVC++ 版本中,他们考虑了X水平方向(列)和Y垂直方向(行),因为CV2只是对这种不匹配的包装OpenCV-C++发生了考虑什么是第一个维度,什么是第二个维度就像我们在Numpy数组中一样。
更新 HansHirse 评论:
OpenCV是一个C++具有表示图像的专用cv::Mat类的库。并且,例如,对于某些cv::Mat图像,image.size返回一个cv::Size对象,该对象按顺序具有宽度和高度,使得几个OpenCV函数中的尺寸参数(宽度,高度)与之一致。Python APIOpenCV使用NumPy数组,默认情况下使用行优先顺序,这样对于某些 NumPy 数组图像,image.shape将按该顺序返回高度和宽度。这里这不是有意的设计选择。