Почему мой cv2.imread() не дает мне None? (питон)

Я новичок в этом деле обнаружения изображений, я смотрел видео на YouTube и пытался создать программу, которая обнаруживает изображение, чтобы я мог автоматизировать некоторую рыбалку в игре. НО я продолжаю получать эту ошибку: каждый раз, когда я указываю правильный путь к файлу изображения, я продолжаю получать вывод «Нет». Может кто-нибудь помочь мне с этим, пожалуйста?

from numpy import asarray
from mss import mss
import cv2
import time
import pyautogui
import imageio.v3 as iio

import os
import shutil

def vision():
    cords = (400,400,1100,400)
    mark = cv2.imread("D:\\Python\\New folder\\apple.png")

    print(cv2.imshow("OpenCV Image",mark))
    
while True:
    vision()    

Мой скриншот вывода:

Почему мой cv2.imread() не дает мне None? (питон)

ожидал, что изображение будет прочитано, но когда я вспоминаю его, оно не работает.

Привет, не могли бы вы показать сообщение об ошибке? Что именно вы подразумеваете под «не могу вспомнить изображение»?

Johnny Cheesecutter 04.06.2024 16:55

Вам нужно вызвать waitKey() после imshow().

Mark Setchell 04.06.2024 16:59
cv2.imshow не возвращает никакого значения, поэтому при вызове print(cv2.imshow(...)) вы получаете None.
wohlstad 04.06.2024 17:08

для этого вообще не требуется imshow для минимально воспроизводимого примера. просто imread и утверждение, что результат не None

Christoph Rackwitz 04.06.2024 19:21

@ChristophRackwitz Я даже не уверен, что изображение, возвращенное из imread (mark), здесь отсутствует. Я думаю, что «Нет», которое мы видим в терминале, связано с тем, что ОП пытается print получить «результат» imshow.

wohlstad 04.06.2024 19:31

в самом заголовке написано imread(), но в коде это не рассматривается... вместо этого речь идет о imshow()... запутанном вопросе.

Christoph Rackwitz 04.06.2024 19:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Внесли небольшие изменения в ваш код, чтобы он стал работоспособным.

Что происходило:

  1. функция cv2.imshow(...) ничего не возвращает. Таким образом, если вы попытаетесь обернуть его в печать, вы увидите в терминале «Нет». Итак, изображение было обработано cv2, но на выходе вы увидели только None. Попробуйте заменить print(cv2.imshow(..)) на cv2.imshow(..).
  2. Вы запускали функцию vision несколько раз в цикле while. Это вызвало печать None несколько раз. Не уверен, что это то, что вы хотели сделать, я бы предложил устранить этот цикл.
  3. После звонка cv2.imgshow(..) нужно дополнительно вызвать cv2.waitKey(...), при этом на экране появится изображение.
import cv2

flag_vision = False

def vision():
    cords = (400,400,1100,400)
    mark = cv2.imread("D:\\Python\\New folder\\apple.png")
    cv2.imshow("OpenCV Image",mark)
    cv2.waitKey(0) 



while True:
   if not flag_vision:
        # prevents function `vision` from running multiple times.
        vision()
        flag_vision = True

вы говорите так, будто думаете, что imread() всегда должен возвращать None («Итак, изображение было обработано cv2»). это неверно. Похоже, вы, мягко говоря, не знакомы с этой частью OpenCV. ваш ответ не решает проблему imread() не чтения файла (т. е. вместо этого возвращает None). перефразирование вопроса или улучшение кода не является ответом. за этот ответ не следовало голосовать.

Christoph Rackwitz 04.06.2024 19:22

Спасибо за комментарий. 1) Я не говорил, что imread возвращает None. 2) Я сказал, что imshow ничего не возвращает. Вы можете увидеть это из подсказок по вводу функций. 3) Я проверил, какую ошибку вернет cv2.imshow, если путь к изображению неверен. И если путь неверен, cv2.imshow не возвращается None и вызывает исключение. 4) Я не прошу Вас проголосовать за мой ответ или принять его. Надеюсь, это прояснит ответ.

Johnny Cheesecutter 04.06.2024 19:31

вы абсолютно правы. виноват. Мне жаль. Я невнимательно прочитал и принял ваше упоминание imshow за imread.

Christoph Rackwitz 04.06.2024 19:57

Другие вопросы по теме