คำสั่ง cv2.imshow ทำงานไม่ถูกต้องใน opencv-python


113

ฉันใช้ opencv 2.4.2, python 2.7 รหัสง่ายๆต่อไปนี้สร้างหน้าต่างชื่อที่ถูกต้อง แต่เนื้อหาว่างเปล่าและไม่แสดงภาพ:

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

มีใครรู้เกี่ยวกับปัญหานี้บ้าง?


เส้นทางไฟล์ของคุณอาจไม่ถูกต้อง Windows ใช้ \ not /. ฉันไม่แน่ใจว่า OpenCV ทน / บน Windows ได้หรือไม่ หากการแก้ไขไม่ได้ผลโปรดตรวจสอบว่ารูปภาพของคุณอยู่ในตำแหน่งที่ถูกต้องและเป็นภาพที่ถูกต้อง
fmw42

มีการสอนเกี่ยวกับพื้นฐานของการอ่าน / แสดงภาพในdocs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

คำตอบ:


231

imshow()ใช้งานได้กับwaitKey():

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

(ข้อความวนรอบทั้งหมดที่จำเป็นสำหรับการอัปเดตหน้าต่างซ่อนอยู่ในนั้น)


3
ตรวจสอบprint imgพิมพ์อาร์เรย์ numpy ที่ถูกต้องไม่ใช่NoneTypeวัตถุ
Abid Rahman K

7
เพื่อความชัดเจนสำหรับลูกหลานภายใต้สถานการณ์ปกตินี่จะเป็นคำตอบที่ถูกต้อง การละเว้น waitKey จะ (โดยปกติ) จะส่งผลให้เกิดพฤติกรรมที่อธิบายไว้ในคำถาม
Snesticle

46

ฉันพบคำตอบที่เหมาะกับฉันที่นี่: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

หากคุณเรียกใช้เซสชัน ipython แบบโต้ตอบและต้องการใช้หน้าต่าง highgui ให้ทำ cv2.startWindowThread () ก่อน

รายละเอียด: HighGUI เป็นอินเทอร์เฟซที่เรียบง่ายในการแสดงภาพและวิดีโอจากรหัส OpenCV ควรจะง่ายพอ ๆ กับ:

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

7
คุณสามารถปิดได้ในภายหลังโดย cv2.destroyAllWindows ()
Zuza

สำหรับการใช้งาน QT ของ highgui startWindowThread () จะไม่ทำอะไรเลย github.com/opencv/opencv/blob/…
kusi

24

คุณต้องใช้หลังจากcv2.waitKey(0) cv2.imshow("window",img)แค่นั้นก็จะได้ผล

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

ฉันจะเพิ่มคุณอาจต้องติดตั้ง python IDE เพื่อแสดงภาพและคุณควรมองหาหน้าต่างบางครั้งมันก็ไม่แสดงด้านหน้า วงเล็บใน cv2.waitKey () ฉันจะถือว่าเป็นหน่วยมิลลิวินาทีและถ้าคุณเว้นว่างไว้มันจะแสดงภาพตลอดไป
Ahmadiah

11

หากคุณใช้งานภายในคอนโซล Python ให้ดำเนินการดังนี้:

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

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

จากนั้นหากคุณกดEnterที่รูปภาพมันจะปิดภาพได้สำเร็จและคุณสามารถดำเนินการคำสั่งอื่น ๆ ได้


7

ฉันประสบปัญหาเดียวกัน ฉันพยายามอ่านรูปภาพจาก IDLE และพยายามแสดงโดยใช้cv2.imshow()แต่หน้าต่างแสดงผลค้างและแสดงว่าpythonw.exeไม่ตอบสนองเมื่อพยายามปิดหน้าต่าง

โพสต์ด้านล่างให้คำอธิบายที่เป็นไปได้ว่าเหตุใดจึงเกิดขึ้น

pythonw.exe ไม่ตอบสนอง

" โดยพื้นฐานแล้วอย่าทำจาก IDLE เขียนสคริปต์และเรียกใช้จากเชลล์หรือสคริปต์โดยตรงหากอยู่ใน windows โดยตั้งชื่อด้วยนามสกุล. pyw และดับเบิลคลิกเห็นได้ชัดว่ามีความขัดแย้งระหว่างเหตุการณ์ของ IDLE เอง วนซ้ำและจากชุดเครื่องมือ GUI "

เมื่อฉันใช้imshow()ในสคริปต์และเรียกใช้งานแทนที่จะเรียกใช้โดยตรงผ่าน IDLE มันใช้งานได้


โปรดเพิ่มคำอธิบายที่ให้ไว้ในลิงค์ (อย่างน้อยที่สุด) เนื่องจากลิงก์อาจค้างได้ ... ขอบคุณ :)
achedeuzot

ชนเพราะนี่คือปัญหาที่ฉันมี แต่ ... "อย่าทำแบบนี้" ไม่ใช่คำตอบที่ฉันกำลังมองหา =)
Eric



3

คุณมีชิ้นส่วนที่จำเป็นทั้งหมดในชุดข้อความนี้:

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

ทำงานได้ดีสำหรับฉันใน IDLE


2

หากคุณยังไม่ได้ใช้งานคุณควรใส่

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

เป็นไฟล์เดียวและเรียกใช้


(คำตอบที่แท้จริงที่นี่คือการเพิ่มcv2.waitKey(0)ข้อความ)
Zimano

1

ไม่ต้องการวิธีการเพิ่มเติมใด ๆ หลังจากนั้นwaitKey(0)(ตอบกลับสำหรับโค้ดด้านบน)

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

หน้าต่างจะปรากฏขึ้น -> คลิกที่หน้าต่างและคลิกที่ Enter หน้าต่างจะปิด


1

วิธีที่ 1:

รหัสต่อไปนี้ใช้ได้ผลสำหรับฉัน เพียงแค่เพิ่ม destroyAllWindows () ไม่ได้ปิดหน้าต่าง การเพิ่ม cv2.waitKey (1) อื่นในตอนท้ายได้ผล

im = cv2.imread("./input.jpg")
cv2.imshow("image", im)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

เครดิต: https://stackoverflow.com/a/50091712/8109630

หมายเหตุสำหรับผู้เริ่มต้น:

  • ซึ่งจะเป็นการเปิดภาพในหน้าต่างแยกต่างหากแทนที่จะแสดงแบบอินไลน์บนโน้ตบุ๊ก นั่นคือเหตุผลที่เราต้องใช้ destroyAllWindows () เพื่อปิดในภายหลัง
  • ดังนั้นหากคุณไม่เห็นหน้าต่างที่แยกออกมาให้ตรวจสอบว่าอยู่หลังหน้าต่างปัจจุบันของคุณหรือไม่
  • หลังจากคุณดูภาพแล้วให้กดปุ่มเพื่อปิดหน้าต่างที่เด้งขึ้นมา

วิธีที่ 2:

หากคุณต้องการแสดงบนสมุดบันทึก Jupyter

from matplotlib import pyplot as plt
import cv2

im = cv2.imread("./input.jpg")
color = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
plt.imshow(color)
plt.title('Image')
plt.show()

0

ฉันยังมีข้อผิดพลาด -215 ฉันคิดว่า imshow เป็นปัญหา แต่เมื่อฉันเปลี่ยน imread ให้อ่านในไฟล์ที่ไม่มีอยู่จริงฉันไม่พบข้อผิดพลาดที่นั่น ดังนั้นฉันจึงใส่ไฟล์รูปภาพในโฟลเดอร์ที่ใช้งานและเพิ่ม cv2.waitKey (0) และมันก็ใช้งานได้


-1

หากคุณเลือกใช้ "cv2.waitKey (0)" ตรวจสอบให้แน่ใจว่าคุณได้เขียน "cv2.waitKey (0)" แทน "cv2.waitkey (0)" เนื่องจากตัวพิมพ์เล็ก "k" อาจทำให้โปรแกรมของคุณหยุดทำงานด้วย .


3
ไม่มีเมธอดที่ใช้คีย์ตัวพิมพ์เล็กใน API รหัสจะทำให้เกิดข้อผิดพลาดเนื่องจากไม่มีวิธีการ
rayryeng

-1

ข้อผิดพลาด: (-215) size.width> 0 && size.height> 0 ในฟังก์ชัน imshow

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไม่พบรูปภาพ ดังนั้นจึงไม่ใช่ข้อผิดพลาดของฟังก์ชัน imshow


ไม่เกี่ยวข้องกับคำถามนี้
rayryeng

-1

ฉันมีข้อผิดพลาด 215 เหมือนกันซึ่งฉันสามารถเอาชนะได้โดยให้เส้นทางแบบเต็มไปยังรูปภาพดังใน C: \ Folder1 \ Folder2 \ filename.ext


"ข้อผิดพลาด 215 เดียวกัน" คืออะไร ไม่มีที่ไหนในคำถาม OPs คือข้อผิดพลาดใด ๆ ที่กล่าวถึง นอกจากนี้ OP ยังใช้เส้นทางแบบเต็มไปยังรูปภาพดังนั้นฉันจึงไม่เห็นว่าสิ่งนี้ตอบคำถามอย่างไร
Max Vollmer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.