为什么 cv2 显示一个空白的灰色方块?

Why is cv2 showing a blank grey square?

我有一个使用 cv2 库的 python 程序,它选择一个随机的美国州,从文件夹中提取州的图像并显示它。它工作正常,所以我保存了它,突然间,它没有显示图像,而是显示一个空白的灰色方块并崩溃。为什么要这样做,我该如何解决?继承人示例图像: sample image second sample image 这是代码:

import cv2
import random
import time

#makes a list of the states
def states():
    states = ['alabama','alaska','arizona','arkansas','california',
    'colorado','connecticut','deleware','florida','georgia','hawaii',
    'idaho','illinois','indiana','iowa','kansas','kentucky','louisiana',
    'maine','maryland','massachussets','michigan','minnesota',
    'mississipi','missouri','montana','nebraska','nevada',
    'new_hampshire','new_jersey','new_mexico','new_york',
    'north_carolina','north_dakota','ohio','oklahoma','oregon',
    'pennsylvania','rhode_island','south_carolina','south_dakota',
    'tennessee','texas','utah','vermont','virginia','washington',
    'west_virginia','wisconsin','wyoming']
    while True:
        #choose a random state from the states list
        state = random.choice(states)
        #take a picture from the states folder, and display it
        img = cv2.imread('picture_files/states/' + state + '.png') 
        cv2.imshow('guess the state!', img)
        #checks if you typed the right state,
        #and gives an appropriate response
        guess = input("guess the state! (type stop to stop!)\n")
        if guess.lower() == state:
            print("Correct!")
            time.sleep(2)
            print("Lets do it again!")
        elif guess.lower() == "stop":
            break
        else:
            print("Nope! It was " + state + ". Keep trying!")
            time.sleep(2)

if __name__ == '__main__':
    states()

我以前遇到过这样的错误,opencv 打不开,我已经通过一些方法成功解决了。

  1. 在你的函数末尾添加cv2.waitKey(0)然后添加 cv2.destroyAllWindows() 在你的呼唤下 states() 像这样:

    if __name__ == '__main__':
        states()
        cv2.destroyAllWindows()
    
  2. 安装opencv-contrib-python.

    尝试使用命令 pip3 install opencv-contrib-python==4.4.0.46 进行安装。

基本上你漏掉了一些 cv2.waitKey() function to show the image (see also here).

这是一个可能的解决方案示例。

def pick_a_state():
    states = ['a','b'] # replace with your list
    return random.choice(states)

def show_state(state):
    img = cv2.imread(state + '.png', cv2.IMREAD_UNCHANGED)
    cv2.imshow('guess the state!', img)
    cv2.waitKey(1000)

def get_the_answer(state):
    guess = raw_input("guess the state! (type stop to stop!)\n")
    if guess.lower() == state:
        print(state)
        print("Correct!")
        time.sleep(2)
        print("Lets do it again!")
        return 1
    elif guess.lower() == "stop":
        return 0
    else:
        print("Nope! It was " + state + ". Keep trying!")
        time.sleep(2)
        return 1

if __name__ == '__main__':
    while True:
        state = pick_a_state()
        show_state(state)
        if get_the_answer(state) == 0:
            cv2.destroyAllWindows()
            break

请分析代码以了解其工作原理。希望能帮到你。