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]
假设两者具有相同数量的通道
我正在编写一个 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]
假设两者具有相同数量的通道