web-dev-qa-db-ja.com

なぜcv2.addweighted()は、操作が「array op array」でも「array op scalar」でも「scalar op array」でもないというエラーを出すのですか?

これは画像ブレンド用の私のコードですが、cv2.addweighted()関数に問題があります:

import cv2
import numpy as np

img1 = cv2.imread('1.png')
img2 = cv2.imread('messi.jpg')
dst= cv2.addWeighted(img1,0.5,img2,0.5,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

エラーは:

Traceback (most recent call last):
    dst= cv2.addWeighted(img1,0.5,img2,0.5,0)
cv2.error: C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:659: error: (-209) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function cv::arithm_op

何が問題ですか?関数を検索し、関数が正しいことを確認しました。エラーを理解できませんでした!

8
alilolo

これを実行すると:

dst= cv2.addWeighted(img1,0.5,img2,0.5,0)

エラー情報:

error: (-209) The operation is neither 'array op array' 
(where arrays have the same size and the same number of channels), 
nor 'array op scalar', nor 'scalar op array' in function cv::arithm_op

考えられる理由:

  1. Img1/img2の1つ以上がnot np.ndarrayです(Noneなど)。多分あなたはそれを読んでいないでしょう。
  2. img1.shapeimg2.shapeと等しくありません。サイズが異なります。

同じサイズかどうかわからない場合は、直接img1.shapeを実行する前に、img2.shapecv2.addWeightedを確認してください。

または、大きな画像に小さな画像を追加する場合は、ROI/mask/slice opを使用する必要があります。

8
Kinght 金

上記の質問の質問と理由2のコメントの1つで指摘したように、画像の1つを他の画像と一致するようにサイズ変更してから、 addWeighted
コードは次のようになります。

import cv2
import numpy as np

img1 = cv2.imread('1.png')
img2 = cv2.imread('messi.jpg')

# Read about the resize method parameters here: https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=resize#resize
img2_resized = cv2.resize(img2, (img1.shape[1], img1.shape[0]))
dst = cv2.addWeighted(img1, 0.7, img2_resized, 0.3, 0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2
ace_racer

私でも同じエラーが発生していました。画像のサイズが異なるため、ROI(画像の領域)を使用しました。つまり、別の画像サイズと同じ画像の一部を取得します。このコードを使用してください:

part = img [0:168,0:300]

img =は、2つの画像のうちの任意の画像です。これは、操作を実行する必要があり、別の画像の内部[]サイズです。

次に、同じサイズの画像を取得し、それらに対して操作を実行します。

1
Prateek Janaj