Python cv2将范围和复制转换为c++;巨蟒
我正在编写一个python视频稳定器,在代码的某些部分,我需要将2个图像复制到画布中 我试图把这个C++代码转换成Python,但我不能。Python cv2将范围和复制转换为c++;巨蟒,python,c++,numpy,opencv,cv2,Python,C++,Numpy,Opencv,Cv2,我正在编写一个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)); // Resi
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函数?
我应该如何将图像复制到画布的特定部分
有什么帮助吗?cv::Mat实际上是python中的numpy数组。在这种情况下,应该使用numpy函数,而不是OpenCV函数 对于copyTo as克隆,请使用copy(),如中所示: 对于范围,numpy更容易。。。只需使用:
a[y1:y2, x1:x2,:]
这意味着从第y1行到第y2行,从第x1列到第x2列。如果您需要全部,只需像所有行一样保留:
:
a[:, x1:x2,:]
最后一个冒号表示通道,在本例中为所有通道,但您也可以对其进行限制。如果你只需要一列或一个频道,你可以直接输入数字,而不是像这样使用“范围”
您还可以删除通道的最后一个冒号,它将使用所有通道。比如:
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]
假设两者具有相同数量的通道cv::Mat实际上是python中的numpy数组。在这种情况下,应该使用numpy函数,而不是OpenCV函数 对于copyTo as克隆,请使用copy(),如中所示: 对于范围,numpy更容易。。。只需使用:
a[y1:y2, x1:x2,:]
这意味着从第y1行到第y2行,从第x1列到第x2列。如果您需要全部,只需像所有行一样保留:
:
a[:, x1:x2,:]
最后一个冒号表示通道,在本例中为所有通道,但您也可以对其进行限制。如果你只需要一列或一个频道,你可以直接输入数字,而不是像这样使用“范围”
您还可以删除通道的最后一个冒号,它将使用所有通道。比如:
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]
假设两者具有相同数量的通道我编写了这段代码,但我遇到了一个错误:您能否详细说明您的代码“不工作”的原因?你在期待什么,到底发生了什么?如果您遇到异常/错误,请发布发生该异常/错误的行以及异常/错误详细信息。请输入这些详细信息,否则我们可能无法提供帮助。我遇到了“无法从形状转换为形状”的错误。但我想我用帆布的方式不对。在cpp代码中有canvas(Range::all(),Range(0,cur2.cols)),我不知道如何在python中使用它!我写了这段代码,但我犯了一个错误:你能详细说明你的代码是如何“不工作”的吗?你在期待什么,到底发生了什么?如果您遇到异常/错误,请发布发生该异常/错误的行以及异常/错误详细信息。请输入这些详细信息,否则我们可能无法提供帮助。我遇到了“无法从形状转换为形状”的错误。但我想我用帆布的方式不对。在cpp代码中有canvas(Range::all(),Range(0,cur2.cols)),我不知道如何在python中使用它!