![](/img/trans.png)
[英]Generated gaussian kernel saturates the image to white color with opencv in C++
[英]OpenCV C++ to calculate vignette effect using gaussian kernel function
我嘗試將這個回復從python轉換為C ++,我被困在第一個調用乘法的地方…… 小是我的輸入Mat帶有2個暗點和大約600x400列/行。
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 ++有所限制。
如果您閱讀cv::multiply
的文檔 ,您會發現它期望前兩個輸入的大小和類型相同。 這是因為它正在嘗試進行逐元素乘法 。
您的高斯核a
定義為600 x 1( getGaussianKernel
建議將第一個輸入設為奇數 ),因此轉置( ta
)將為1 x 600。
第二個輸入b
定義為400 x 1(同樣,實際上應該是奇數大小)。
顯然,這兩個尺寸/尺寸不相同。
而不是使用cv::multiply
(逐元素乘法),您只需要使用*
運算符即可,它是您可能想要的矩陣乘積 。
Mat C = b * ta
這應該產生一個400 x 600的矩陣。
另外,我切換了b
和ta
的順序,以便計算出矩陣尺寸以進行乘法運算。
請注意 ,您的代碼還存在其他一些問題。 您正在使用cv::max()
將空矩陣與c
進行比較。 您可能應該使用cv::minMaxLoc
。
最后一行的乘法看起來應該沒問題,因為您希望將高斯圖像的組合直接按像素或逐個元素應用於輸入圖像。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.