Lệnh cv2.imshow không hoạt động bình thường trong opencv-python


111

Tôi đang sử dụng opencv 2.4.2, python 2.7 Đoạn mã đơn giản sau đã tạo một cửa sổ có tên chính xác, nhưng nội dung của nó chỉ để trống và không hiển thị hình ảnh:

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)

có ai biết về vấn đề này?


Đường dẫn tệp của bạn có thể sai. Windows sử dụng \ not /. Tôi không chắc liệu OpenCV có dung nạp / trên Windows không? Nếu việc khắc phục không giúp được gì, thì hãy đảm bảo hình ảnh của bạn ở đúng vị trí và là hình ảnh hợp lệ.
fmw42 14/09/19

Có một hướng dẫn với những kiến ​​thức cơ bản về đọc / hiển thị hình ảnh trong docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

Câu trả lời:


228

imshow()chỉ hoạt động với waitKey():

import cv2
img = cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow', img)
cv2.waitKey()

(Toàn bộ vòng lặp thông báo cần thiết để cập nhật cửa sổ được ẩn trong đó.)


3
kiểm tra print imgbản in một mảng numpy chính xác, không phải một NoneTypeđối tượng.
Abid Rahman K

7
Chỉ cần nói rõ cho hậu thế, trong những trường hợp bình thường, đây sẽ là câu trả lời chính xác. Việc bỏ qua waitKey sẽ (thường) dẫn đến chính xác hành vi được mô tả trong câu hỏi.
Bài báo

45

Tôi đã tìm thấy câu trả lời phù hợp với mình tại đây: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Nếu bạn chạy một phiên ipython tương tác và muốn sử dụng cửa sổ highgui, hãy thực hiện cv2.startWindowThread () trước.

Chi tiết: HighGUI là một giao diện đơn giản hóa để hiển thị hình ảnh và video từ mã OpenCV. Nó phải dễ dàng như:

import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)

7
Bạn có thể đóng nó lại sau đó bởi cv2.destroyAllWindows ()
Zuza

Đối với việc triển khai QT của highgui, startWindowThread () không làm gì cả. github.com/opencv/opencv/blob/…
kusi

24

Bạn phải sử dụng cv2.waitKey(0)sau khi cv2.imshow("window",img). Chỉ sau đó nó sẽ hoạt động.

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

Tôi muốn nói thêm rằng bạn có thể cần cài đặt python IDE để hiển thị hình ảnh và bạn cũng nên tìm kiếm cửa sổ đôi khi nó không hiển thị ở phía trước. Dấu ngoặc đơn trong cv2.waitKey () Tôi sẽ giả sử là milsecond và nếu bạn để trống, nó sẽ hiển thị hình ảnh mãi mãi.
Ahmadiah

11

Nếu bạn đang chạy bên trong bảng điều khiển Python, hãy làm như sau:

img = cv2.imread("yourimage.jpg")

cv2.imshow("img", img); cv2.waitKey(0); cv2.destroyAllWindows()

Sau đó nếu bạn ấn Entervào ảnh thì nó sẽ đóng ảnh thành công và bạn có thể tiến hành chạy các lệnh khác.


7

Tôi phải đối mặt với cùng một vấn đề. Tôi đã cố đọc một hình ảnh từ IDLE và cố gắng hiển thị nó bằng cách sử dụng cv2.imshow(), nhưng cửa sổ hiển thị bị đóng băng và hiển thịpythonw.exe không phản hồi khi cố gắng đóng cửa sổ.

Bài đăng dưới đây đưa ra lời giải thích khả thi cho lý do tại sao điều này lại xảy ra

pythonw.exe không phản hồi

" Về cơ bản, không làm điều này từ IDLE. Viết một tập lệnh và chạy nó từ shell hoặc script trực tiếp nếu trong windows, bằng cách đặt tên nó bằng phần mở rộng .pyw và nhấp đúp vào nó. Rõ ràng là có xung đột giữa sự kiện riêng của IDLE vòng lặp và những cái từ bộ công cụ GUI. "

Khi tôi sử dụng imshow()trong một tập lệnh và thực thi nó thay vì chạy trực tiếp qua IDLE, nó đã hoạt động.


Vui lòng thêm lời giải thích được cung cấp tại liên kết (mức tối thiểu ít nhất) vì liên kết có thể cũ đi ... Cảm ơn :)
achedeuzot

Bump vì đây là vấn đề mà tôi gặp phải nhưng ... "đừng làm điều này" không phải là câu trả lời mà tôi đang tìm kiếm =)
Eric


4

Đối với tôi waitKey () với số lớn hơn 0 đã hoạt động

    cv2.waitKey(1)

3

Bạn đã có tất cả các phần cần thiết ở đâu đó trong chuỗi này:

if cv2.waitKey(): cv2.destroyAllWindows()

hoạt động tốt cho tôi trong IDLE.


3

Nếu bạn chưa làm cho việc này hoạt động, bạn nên đặt

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

vào một tệp và chạy nó.


1

Không cần bất kỳ phương pháp bổ sung nào sau waitKey(0)(trả lời cho mã trên)

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)
cv2.waitKey(0)

Cửa sổ hiện ra -> Nhấp vào Cửa sổ & Nhấp vào Enter. Cửa sổ sẽ đóng lại.


0

Nếu bạn chọn sử dụng "cv2.waitKey (0)", hãy đảm bảo rằng bạn đã viết "cv2.waitKey (0)" thay vì "cv2.waitkey (0)", vì chữ thường "k" đó cũng có thể đóng băng chương trình của bạn .


3
Phương thức có khóa chữ thường không tồn tại trong API. Mã sẽ xuất hiện một lỗi vì phương thức không tồn tại.
rayryeng 14/02/19

0

Tôi cũng có một lỗi -215. Tôi nghĩ imshow là vấn đề, nhưng khi tôi thay đổi imread thành đọc trong một tệp không tồn tại, tôi không gặp lỗi ở đó. Vì vậy, tôi đặt tệp hình ảnh vào thư mục làm việc và thêm cv2.waitKey (0) và nó đã hoạt động.


-1

error: (-215) size.width> 0 && size.height> 0 trong hàm imshow

Lỗi này được tạo ra vì không tìm thấy hình ảnh. Vì vậy, nó không phải là một lỗi của chức năng imshow.


Không liên quan đến câu hỏi này.
rayryeng 14/02/19

-1

Tôi đã gặp lỗi 215 tương tự, mà tôi có thể khắc phục bằng cách cung cấp đường dẫn đầy đủ đến hình ảnh, như trong C: \ Folder1 \ Folder2 \ filename.ext


"Lỗi 215 giống nhau" là gì? Không có lỗi nào được đề cập trong câu hỏi OPs. Ngoài ra OP đang sử dụng một đường dẫn đầy đủ đến hình ảnh, vì vậy tôi không biết điều này trả lời câu hỏi như thế nào.
Max Vollmer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.