Python OpenCV no da misma salida en la misma imagen

Aaron:

Estoy intentando crear un programa que comprueba si 2 imágenes son los mismos. Tengo el siguiente código, que es ejecutado tanto con las imágenes:

img = cv2.imread('canvas.png')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (70,70,300,250)
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
img = img[84:191, 84:203]
count = 1
cv2.imwrite("tmp/"+str(count)+".png", img)

Primera vez que ejecute esto, me da el siguiente resultado: Primera imagen . Después de algún tiempo ~ 7 segundos, lo hago con exactamente la misma imagen, y me da el siguiente resultado: Segunda imagen . Yo probé de nuevo, y de nuevo tengo una salida diferente: tercer intento?

Estoy tratando de comprobar si la imagen es la misma (como en el contenido), pero no puedo conseguir este trabajo. Estoy usando el siguiente fragmento de código que se encuentra en Stackoverflow para comprobar similitudes:

def is_similar(image1, image2):
    return image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())

Y que devuelve false cuando se marque la primera con la segunda imagen. ¿Cómo puedo hacer este trabajo a cabo?

Gracias por tu tiempo,

==== ==== EDITAR

Aquí es canvas.png

==== EDIT 2 ====

Después de mirar @Rotem su respuesta, lo he intentado, pero sigue mostrando una ligera diferencia, que la función anterior de retorno Falseen: Foto 1ypicutre 2

Rojo:

cv2.grabCutno da resultados deterministas debido a que los usos del algoritmo GrabCut construidos en el azar .

De acuerdo a Wikipedia :

Esto se utiliza para construir una Markov aleatoria de campo sobre las etiquetas de píxeles ...

Es posible evitar la aleatoriedad restableciendo la semilla del generador aleatorio de OpenCV antes de ejecutar cv2.grabCut:

cv2.setRNGSeed(0)

Aquí está un ejemplo de código:

for count in range(10):
    cv2.setRNGSeed(0)
    img = cv2.imread('canvas.png')
    mask = np.zeros(img.shape[:2],np.uint8)
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    rect = (70,70,300,250)
    cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    img = img*mask2[:,:,np.newaxis]
    img = img[84:191, 84:203]
    cv2.imwrite(str(count)+".png", img)

Actualizar:

Usted puede utilizar el siguiente bucle de comparar las imágenes:

# Verify that all images are the same
for count in range(10):
    im = cv2.imread(str(count)+".png")
    is_same = is_similar(im, img)
    if not is_same:
        print('Images are not the same, and it is strange!')

En mi máquina que son todos iguales.


código completo:

import cv2
import numpy as np

# Disable OpenCL and disable multi-threading.
cv2.ocl.setUseOpenCL(False)
cv2.setNumThreads(1)


def is_similar(image1, image2):
    return image1.shape == image2.shape and not(np.bitwise_xor(image1,image2).any())

for count in range(10):
    cv2.setRNGSeed(0)
    img = cv2.imread('canvas.png')
    mask = np.zeros(img.shape[:2],np.uint8)
    bgdModel = np.zeros((1,65),np.float64)
    fgdModel = np.zeros((1,65),np.float64)
    rect = (70,70,300,250)
    cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
    img = img*mask2[:,:,np.newaxis]
    img = img[84:191, 84:203]
    cv2.imwrite(str(count)+".png", img)


# Verify that all images are the same
for count in range(10):
    im = cv2.imread(str(count)+".png")
    is_same = is_similar(im, img)
    if not is_same:
        print('Images are not the same, and it is strange!')

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=388017&siteId=1
Recomendado
Clasificación