【问题标题】:cv2 convert Range and copyTo functions of c++ to pythoncv2将c++的Range和copyTo函数转换为python
【发布时间】:2019-06-20 14:25:19
【问题描述】:

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

我试图将此 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)

我明白了

“无法从形状广播到形状”

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

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

有什么帮助吗?

【问题讨论】:

  • 我写了这段代码,但我得到了错误:你能详细说明你的代码是如何“不起作用”的吗?你期待什么,实际发生了什么?如果您遇到异常/错误,请发布它发生的行和异常/错误详细信息。请edit这些详细信息,否则我们可能无法提供帮助。
  • 我得到“无法从形状转换成形状”错误。但我认为我以错误的方式使用了画布。在 cpp 代码中有 canvas(Range::all(), Range(0, cur2.cols)) 我不知道如何在 python 中使用它!

标签: python c++ numpy opencv cv2


【解决方案1】:

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 列或通道,您可以直接输入数字,而不是使用像

这样的“范围”
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]

假设两者的频道数相同

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 2014-04-22
    • 2022-01-04
    • 2018-01-07
    • 1970-01-01
    • 2016-02-23
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多