我尝试将this reply从python转换为C ++,并且我第一次调用倍增... small 是我的输入垫,有2个dims和大约600x400 cols / rows。
Mat a = getGaussianKernel(small.cols, .3);
Mat b = getGaussianKernel(small.rows, .3);
Mat ta;
transpose(a, ta);
Mat c = *new Mat(ta.rows, ta.cols, ta.type());
cv::multiply(ta, b, c);
Mat d;
cv::max(c, d);
d = c / d;
Mat e;
multiply(small, d, e);
错误消息显示为:
该操作既不是'数组操作数组'(其中数组具有相同的大小和相同数量的通道),也不是'数组操作标量',也不是函数中的'标量操作数组'arithm_op
我对numpy或matplotlib都不熟悉,但我对C ++有所限制,原因很难解释......
答案 0 :(得分:2)
如果您阅读cv::multiply
的{{3}},您会发现前两个输入的大小和类型相同。这是因为它试图进行逐元素乘法。
您的高斯内核a
定义为600 x 1(getGaussianKernel
建议第一个输入为奇数),因此转置(ta
)将是1 x 600。
第二个输入b
被定义为400 x 1(再次,应该是一个奇怪的大小)。
显然这两个尺寸/尺寸不同。
您希望只使用您可能想要的documentation cv::multiply
运算符,而不是使用逐元素乘法的*
。
Mat C = b * ta
哪个应该产生400 x 600矩阵。
另外,我改变了b
和ta
的顺序,以便矩阵维度可以用于乘法。
注意您的代码也存在其他一些问题。您正在使用cv::max()
将空矩阵与c
进行比较。您应该使用matrix product。
你最后一行的乘法看起来应该没问题,因为你想要逐个像素或逐个元素地将高斯图像的组合直接应用到输入图像。