cv2 将 c++ 的 Range 和 copyTo 函数转换为 python

cv2 convert Range and copyTo functions of c++ to python

我正在编写一个 python 视频稳定器,在代码的某些部分我需要将 2 张图像复制到 canvas。

我试图将此 C++ 代码转换为 python,但我做不到。

Mat cur2;

warpAffine(cur, cur2, T, cur.size());

cur2 = cur2(Range(vert_border, cur2.rows-vert_border), 
Range(HORIZONTAL_BORDER_CROP, cur2.cols-HORIZONTAL_BORDER_CROP));

// Resize cur2 back to cur size, for better side by side comparison
resize(cur2, cur2, cur.size());

// Now draw the original and stablised side by side for coolness
Mat canvas = Mat::zeros(cur.rows, cur.cols*2+10, cur.type());

cur.copyTo(canvas(Range::all(), Range(0, cur2.cols)));
cur2.copyTo(canvas(Range::all(), Range(cur2.cols+10, cur2.cols*2+10)));

我写了这段代码,但出现错误:

ret, frame = cap.read()
new_frame = transform(frame,data[counter]) #some kind of low pass filter

canvas = np.zeros ((frame_height, frame_width*2+10,3))
np.copyto (canvas[:frame_width], frame)
np.copyto (canvas[frame_width+10:frame_width*2+10], new_frame)

我得到了

"couldnt boradcast from shape into shape"

错了。但我认为我以错误的方式使用了 canvas。在 cpp 代码中有 canvas(Range::all(), Range(0, cur2.cols)),我不知道如何在 python

中使用它

如何在python中使用Range函数和copyTo函数? 我应该如何将图像复制到 canvas 的特定部分?

有什么帮助吗?

cv::Mat 实际上是 python 中的 numpy 数组。在这种情况下,您应该使用 numpy 函数而不是 OpenCV 函数。

对于作为克隆的 copyTo,使用 copy() 如下:

a = np.zeros((10,10,3), dtype=np.uint8)
b = a.copy()

对于范围,在 numpy 中更容易...只需使用:

a[y1:y2, x1:x2,:]

表示从第y1行到第y2行,从第x1列到第x2列。如果您需要全部,只需像所有行一样保留 :

a[:, x1:x2,:]

最后一个冒号表示频道,在本例中是所有频道,但您也可以对其进行限制。如果您只需要 1 列或频道,您可以直接输入数字而不是使用 "range" 之类的

a[4, x1:x2, 0]

您也可以删除频道的最后一个冒号,它将使用所有频道。喜欢:

a[1:3, 4:8]

最后,要将值复制到图像中的某个位置,您可以执行以下操作:

bigImage[y1:y2, x1:x2] =  image

您必须确保图像适合这个地方(包括频道)。这意味着,如果图片的尺寸为 640x480,则不能这样做:

bigImage[10:20, 20:30] =  image

但你可以做类似的事情

bigImage[10:20, 20:30] =  image[10:20, 10:20]

假设两者具有相同数量的通道