Почему ' cv2.imshow () ' функция не отображает мое изображение должным образом?

Каждый раз, когда я запускаю свой код, все изображения отображаются правильно, кроме изображения с именем «FireRegion». Он отображается как прозрачное окно или окно с ошибками. Функция countNonZero () работает нормально, но изображение не отображается. Он работает правильно, когда я не использую функцию np.where (), и для ее использования после этого мне нужно использовать astype для преобразования типа изображения в uint8, иначе компилятор выдаст ошибку. Я думаю, что это происходит из-за bitwise_and (), но это всего лишь предположение. Ниже мой код:

from playsound import playsound
import cv2 
import numpy as np 
import time

if True:
    img = cv2.imread('WFire.jpg')
    Rule1 = img.copy()
    Rule2 = img.copy()
    Rule3 = img.copy()
    Rule4 = img.copy()
    Rule5 = img.copy()
    RE = img.copy()
    RE2 = img.copy()
    Ymean = img.copy()

    YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
    Y = YCrCb[:,:,0]
    Cr = YCrCb[:,:,1]
    Cb = YCrCb[:,:,2]

    Ym = int(np.mean(Y))
    Crm = int(np.mean(Cr))
    Cbm = int(np.mean(Cb))

    # h = img.shape[0]
    # w = img.shape[1]

    # for x in range(0,h) :
        # for y in range(0,w) :
            # RE[x,y] = 255 if Y[x,y] > Cb[x,y] else 0
            # RE2[x,y] = 255 if Cr[x,y] > Cb[x,y] else 0
            # Rule3[x,y] = 255 if abs(int(Cb[x,y])-int(Cr[x,y]))>=70 else 0
            # RE[x,y] = 255 if Y[x,y]>Ym or Cb[x,y]>Cbm or Cr[x,y]>Crm else 0  
            # RE2[x,y] = 255 if Cb[x,y]<=120 and Cr[x,y]>=150 else 0
            
    Ymean = np.where(True,Ym,0)       
       
    Rule1 = np.where(Y>Cb,255,0)
    Rule2 = np.where(Cr>Cb,255,0)
    Rule3 = np.where(abs(Cb-Cr)>=70,255,0)
    Rule4 = np.where((Y>Ym)|(Cb>Cbm)|(Cr>Crm),255,0) 
    Rule5 = np.where((Cb<=120) & (Cr>=150),255,0)
    
    FireRegion = cv2.bitwise_and(Rule1,Rule2)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule3)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule4)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule5)
    # FireRegionGray = cv2.cvtColor(FireRegion.astype(np.float32),cv2.COLOR_BGR2GRAY)    
    NFP = cv2.countNonZero(FireRegion)
    print(NFP)
    # if NFP>2000 :
        # playsound('duck1.mp3')
    
    cv2.imshow("Y",Y)
    cv2.imshow("Cr",Cr)
    cv2.imshow("Cb",Cb)
    cv2.imshow("Original",img)
    cv2.imshow("Rule1",Rule1.astype(np.uint8))
    cv2.imshow("Rule2",Rule2.astype(np.uint8))
    cv2.imshow("Rule3",Rule3.astype(np.uint8))
    cv2.imshow("Rule4",Rule4.astype(np.uint8))
    cv2.imshow("Rule5",Rule5.astype(np.uint8))
    cv2.imshow("FireRegion",FireRegion.astype(np.uint8))

    
    key = cv2.waitKey(0)
    # if key ==27 :
        # break

Всего 1 ответ


попробуйте это:

    FR_1 = cv2.bitwise_and(Rule1,Rule2)   
    FR_2 = cv2.bitwise_and(FR_1,Rule3)   
    FR_3 = cv2.bitwise_and(FR_2,Rule4)   
    FireRegion = cv2.bitwise_and(FR_3,Rule5)

Вместо:

    FireRegion = cv2.bitwise_and(Rule1,Rule2)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule3)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule4)   
    FireRegion = cv2.bitwise_and(FireRegion,Rule5)

Есть идеи?

10000