web-dev-qa-db-fra.com

Pourquoi cv2.addweighted () donne-t-il une erreur indiquant que l'opération n'est ni «array op array», ni «array op scalar», ni «scalar op array»?

Voici mon code pour le mélange d'images, mais il y a un problème avec la fonction 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()

L'erreur est:

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

Quel est le problème? J'ai recherché la fonction et je suis sûr que la fonction est correcte. Je n'ai pas compris l'erreur!

8
alilolo

Lorsque vous exécutez ceci:

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

Informations sur l'erreur:

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

Raisons possibles:

  1. Un ou plusieurs des img1/img2 sont not np.ndarray, comme None. Peut-être que vous ne l'avez pas lu.
  2. img1.shape n'est pas égal à img2.shape. Ils ont des tailles différentes.

Vous devriez vérifier img1.shape et img2.shape avant de faire directement cv2.addWeighted si vous n'êtes pas sûr qu'ils soient de la même taille.

Ou, si vous voulez ajouter une petite image sur la grande, vous devez utiliser ROI/mask/slice op.

8
Kinght 金

Comme indiqué dans l'un des commentaires de la question et de la raison 2 de la réponse ci-dessus, vous pouvez également essayer de redimensionner l'une des images pour qu'elle corresponde à l'autre, puis essayez la addWeighted.
Votre code ressemblerait alors à celui-ci:

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

même j'obtenais la même erreur. C'est à cause de différentes tailles d'images, alors j'ai utilisé ROI (région de l'image), c'est-à-dire, juste prendre une partie de l'image qui est identique à une autre taille d'image. utilisez ce code:

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

img = est n'importe quelle image parmi les deux images, sur laquelle vous souhaitez effectuer une opération et à l'intérieur de la taille [] d'une autre image.

Ensuite, vous obtenez des images de même taille, puis effectuez des opérations sur celles-ci.

1
Prateek Janaj