ข้อผิดพลาด cv เปิด: (-215) scn == 3 || scn == 4 ในฟังก์ชัน cvtColor


92

ตอนนี้ฉันใช้ Ubuntu 14.04 โดยใช้ python 2.7 และ cv2

เมื่อฉันเรียกใช้รหัสนี้:

import numpy as np
import cv2

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

มันกลับมา:

 File "face_detection.py", line 11, in <module>
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

ฉันค้นหาที่นี่แล้วและมีคำตอบหนึ่งบอกว่าฉันอาจโหลดรูปภาพผิดวิธีเนื่องจากควรมี 3 มิติ: แถวคอลัมน์และความลึก

เมื่อฉันพิมพ์ img.shape มันจะส่งกลับเพียงสองตัวเลขดังนั้นฉันต้องทำผิด แต่ฉันไม่รู้วิธีโหลดรูปภาพที่ถูกต้อง


11
img = cv2.imread('2015-05-27-191152.jpg',0)พารามิเตอร์ 0 โหลดรูปภาพของคุณเป็นภาพระดับสีเทา 1 ช่องแล้ว ดังนั้นลองimg = cv2.imread('2015-05-27-191152.jpg')หรือgray = cv2.imread('2015-05-27-191152.jpg',0)ดูแฟล็กต่างๆที่: docs.opencv.org/modules/highgui/doc/…
มิกก้า

ฉันก็มีปัญหานี้เช่นกัน แต่กลับกลายเป็นว่ามีช่องว่าง ( .../eclipse\ footage/...) ในเส้นทางของฉัน ดังนั้นการเพิ่ม...,0)ไม่สามารถแก้ไขได้
Cody

คำตอบ:


105

ให้เส้นทางเต็มรูปแบบของภาพด้วยเครื่องหมายทับ มันแก้ไขข้อผิดพลาดให้ฉัน

เช่น

import numpy as np
import cv2

img = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

นอกจากนี้หากคุณให้0พารามิเตอร์ที่สองในขณะที่โหลดภาพโดยใช้cv2.imreadมากกว่าที่ไม่จำเป็นต้องแปลงภาพโดยใช้ภาพcvtColorนั้นจะถูกโหลดเป็นภาพระดับสีเทาแล้วเช่น

import numpy as np
import cv2

gray = cv2.imread('C:/Python34/images/2015-05-27-191152.jpg',0)

6
ในกรณีที่คุณจับภาพจากกล้อง: คุณจะได้รับข้อผิดพลาดนี้หากไม่สามารถเข้าถึงกล้องได้
ger.s.brett

1
... หรือถ้าคุณให้เป็นเส้นทางที่ไม่ถูกต้องไปยังไฟล์วิดีโอของคุณ; P ผมเคยพบปัญหานี้ whien ฉัน messed ขึ้น (c เขียน: / แทน C: //) เส้นทางแช่งหน้าต่าง
ตะโพก

17

กรุณาตั้งค่าดังต่อไปนี้

img = cv2.imread('2015-05-27-191152.jpg',1)     // Change Flag As 1 For Color Image
                                                //or O for Gray Image So It image is 
                                                //already gray

6
img = cv2.imread('2015-05-27-191152.jpg',0)

บรรทัดด้านบนของรหัสอ่านรูปภาพของคุณในแบบจำลองสีระดับสีเทาเนื่องจากมี 0 ต่อท้าย และหากคุณพยายามแปลงภาพสีเทาเป็นภาพสีเทาอีกครั้งจะแสดงข้อผิดพลาดนั้น

ดังนั้นให้ใช้รูปแบบด้านบนหรือลองใช้รหัสที่ระบุ:

img = cv2.imread('2015-05-27-191152.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


4

สิ่งแรกที่คุณควรตรวจสอบคือรูปภาพนั้นมีอยู่ในไดเรกทอรีรากหรือไม่ ส่วนใหญ่เกิดจากรูปภาพที่มีความสูง = 0 ซึ่งหมายความcv2.imread(imageName)ว่าไม่ได้อ่านรูปภาพ


คำตอบนี้ช่วยแก้ปัญหาของฉัน - ฉันอ่านวิดีโอมันไม่หยุดโดยอัตโนมัติเมื่อวิดีโอจบลงดังนั้นฉันจึงได้รับข้อผิดพลาดเดียวกันกับการพยายามทำให้cv2.cvtColorเฟรมว่างเปล่า
Mikhail_Sam

3

ฉันมีข้อความแสดงข้อผิดพลาดนี้ปรากฏขึ้นด้วยเหตุผลที่ไม่เกี่ยวข้องกับแฟล็ก 0 หรือ 1 ที่กล่าวถึงในคำตอบอื่น ๆ คุณอาจจะเห็นมันเช่นกันเพราะcv2.imreadจะไม่ผิดพลาดหากสตริงเส้นทางที่คุณส่งผ่านไม่ใช่รูปภาพ:

In [1]: import cv2
   ...: img = cv2.imread('asdfasdf')  # This is clearly not an image file
   ...: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   ...:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp, line 10638
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-4-19408d38116b> in <module>()
      1 import cv2
      2 img = cv2.imread('asdfasdf')  # This is clearly not an image file
----> 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

error: C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:10638: error: (-215) scn == 3 || scn == 4 in function cv::cvtColor

ดังนั้นคุณจะเห็นcvtColorความล้มเหลวเมื่อเป็นimreadข้อผิดพลาดเงียบ เก็บที่ในใจในครั้งต่อไปที่คุณจะไปเสียชั่วโมงในชีวิตของคุณกับอุปมาเป็นความลับ

วิธีการแก้

คุณอาจต้องตรวจสอบว่าสตริงเส้นทางของคุณแสดงถึงไฟล์ที่ถูกต้องก่อนที่จะส่งไปยังcv2.imread:

import os


def read_img(path):
    """Given a path to an image file, returns a cv2 array

    str -> np.ndarray"""
    if os.path.isfile(path):
        return cv2.imread(path)
    else:
        raise ValueError('Path provided is not a valid file: {}'.format(path))


path = '2015-05-27-191152.jpg'
img = read_img(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

เขียนด้วยวิธีนี้รหัสของคุณจะล้มเหลวอย่างสง่างาม


1

คำตอบนี้หากสำหรับผู้ที่ประสบปัญหาเดียวกันกับการพยายามเข้าถึงกล้อง

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

ใช้ Linux:

หากคุณพยายามเข้าถึงกล้องจากคอมพิวเตอร์ของคุณซึ่งเป็นไปได้มากว่าจะมีปัญหาด้านการอนุญาตให้ลองเรียกใช้สคริปต์ python ด้วย sudo ซึ่งควรแก้ไขได้

sudo python python_script.py

หากต้องการทดสอบว่ากล้องสามารถเข้าถึงได้หรือไม่ให้รันคำสั่งต่อไปนี้

ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv 

1
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/imgproc/src/color.cpp:7564: error: (-215) scn == 3 || scn == 4 in function cvtColor

ข้อผิดพลาดข้างต้นเป็นผลมาจากชื่อรูปภาพที่ไม่ถูกต้องหรือหากไฟล์ไม่มีอยู่ในไดเร็กทอรีโลคัล

img = cv2.imread('2015-05-27-191152.jpg',0)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

นอกจากนี้หากคุณกำลังใช้อาร์กิวเมนต์ที่ 2 ของ cv2.imread () เป็น '0' แสดงว่ามันถูกแปลงเป็นรูปภาพที่ปรับขนาดแล้ว

ความแตกต่างระหว่างการแปลงรูปภาพโดยส่ง 0 เป็นพารามิเตอร์และใช้สิ่งต่อไปนี้:

img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY) 

ก็คือในกรณีนี้img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)รูปภาพจะเป็นรูปภาพประเภท 8uC1 และ 32sC1


1

รหัสนี้สำหรับผู้ที่ประสบปัญหาเดียวกันในการพยายามเข้าถึงกล้องสามารถเขียนได้ด้วยการตรวจสอบความปลอดภัย

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   continue

หรือในกรณีที่คุณต้องการปิดกล้อง / เลิกใช้งานหากกรอบภาพจะมีปัญหา

if ret is True:
   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
   break

สำหรับการอ้างอิงhttps://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36


0

นี่คือสิ่งที่ฉันสังเกตเห็นเมื่อใช้ชุดรูปภาพของตัวเองใน.jpgรูปแบบ ในสคริปต์ตัวอย่างที่มีอยู่ในOpencv docโปรดทราบว่ามีundistortและcrop the imageบรรทัดดังต่อไปนี้:

# undistort
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# crop the image
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)

ดังนั้นเมื่อเรารันโค้ดเป็นครั้งแรกระบบจะรันบรรทัดที่cv2.imwrite('calibresult.jpg',dst)บันทึกรูปภาพcalibresult.jpgในไดเร็กทอรีปัจจุบัน ดังนั้นเมื่อฉันรันโค้ดในครั้งต่อไปพร้อมกับชุดรูปภาพตัวอย่างของฉันที่ฉันใช้สำหรับปรับเทียบกล้องในรูปแบบ jpg โค้ดก็พยายามพิจารณารูปภาพที่เพิ่มใหม่นี้calibresult.jpgเนื่องจากข้อผิดพลาดโผล่ออกมา

error: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor

สิ่งที่ฉันทำคือ: ฉันเพียงแค่ลบภาพที่สร้างขึ้นใหม่หลังจากการรันแต่ละครั้งหรือเปลี่ยนประเภทของรูปภาพเพื่อพูดpngหรือtiffพิมพ์ ที่ช่วยแก้ปัญหา ตรวจสอบว่าคุณกำลังป้อนและเขียนcalibresultประเภทเดียวกันหรือไม่ ถ้าเป็นเช่นนั้นเพียงแค่เปลี่ยนประเภท


0

บน OS XI ตระหนักว่าในขณะที่ cv2.imread สามารถจัดการกับ "filename.jpg" แต่ไม่สามารถประมวลผล "file.name.jpg" ได้ ในฐานะมือใหม่หัด python ฉันยังไม่สามารถเสนอวิธีแก้ปัญหาได้ แต่ตามที่François Leblanc เขียนไว้มันเป็นข้อผิดพลาดที่ไม่ได้อ่าน

ดังนั้นจึงมีปัญหากับจุดเพิ่มเติมในชื่อไฟล์และสัญลักษณ์อื่น ๆ เช่นเดียวกับ "" (Space) หรือ "%" เป็นต้น


0

ฉันยังพบว่าเว็บแคมของคุณไม่ได้ปิดไปทางขวาหรือมีบางอย่างกำลังใช้งานอยู่ CV2 จะให้ข้อผิดพลาดเดียวกันนี้ ฉันต้องรีสตาร์ทพีซีเพื่อให้ทำงานได้อีกครั้ง


0

วิธีที่ง่ายที่สุดในการลบข้อผิดพลาดนั้นคือการเรียกใช้คำสั่ง

cap.release()
cv2.closeAllWindows()

นั่นใช้ได้ผลสำหรับฉันและบางครั้งก็จำเป็นต้องรีสตาร์ทเคอร์เนลเนื่องจากกระบวนการเก่าที่ทำงานอยู่เบื้องหลัง

หากรูปภาพไม่ได้อยู่ในไดเร็กทอรีการทำงานก็จะไม่ทำงานด้วยเช่นกันให้พยายามวางไฟล์รูปภาพใน pwd ในโฟลเดอร์เดียวกันเนื่องจากมีโค้ดอื่นให้เส้นทางแบบเต็มไปยังไฟล์รูปภาพหรือโฟลเดอร์

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


0

2015-05-27-191152.jpg << เมื่อมองย้อนกลับไปที่รูปแบบภาพของคุณบางครั้งฉันก็สับสนระหว่าง. png และ. jpg และพบข้อผิดพลาดเดียวกัน


0

ฉันคิดว่ามันเพราะcv2.imreadไม่สามารถอ่าน.jpgภาพคุณจะต้องมีการเปลี่ยนแปลงไป.jpg.png


0

ในกรณีของฉันข้อผิดพลาดได้รับการแก้ไขโดยการย้ายไปยัง OpenCV 4.0 (หรือสูงกว่า)


0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.