açık cv hatası: (-215) scn == 3 || scn == 4 cvtColor işlevinde


91

Şu anda Ubuntu 14.04'teyim, python 2.7 ve cv2 kullanıyorum.

Bu kodu çalıştırdığımda:

import numpy as np
import cv2

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

döndürür:

 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

Zaten burayı araştırdım ve bir cevap, fotoğrafımı yanlış şekilde yükleyebileceğimi söyledi, çünkü 3 boyuta sahip olması gerekiyor: satırlar, sütunlar ve derinlik.

İmg.shape'i yazdırdığımda sadece iki sayı döndürüyor, bu yüzden yanlış yapmalıyım. Ama fotoğrafımı yüklemenin doğru yolunu bilmiyorum.


11
img = cv2.imread('2015-05-27-191152.jpg',0)0 parametresi görüntünüzü zaten 1 kanallı gri tonlamalı bir görüntü olarak yükler. Öyleyse şu adresteki farklı bayraklara göz atın img = cv2.imread('2015-05-27-191152.jpg')veya deneyin gray = cv2.imread('2015-05-27-191152.jpg',0): docs.opencv.org/modules/highgui/doc/…
Micka

Benim de bu problemi yaşadım, ama .../eclipse\ footage/...yolumda bir boşluk ( ) olduğu ortaya çıktı . Yani bir eklemek ...,0)sorunu çözmedi.
Cody

Yanıtlar:


104

Eğik çizgi ile görüntünün tam yolunu verin. Benim için hatayı çözdü.

Örneğin

import numpy as np
import cv2

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

Ayrıca 0görüntüyü yüklerken ikinci parametreyi kullanarak cv2.imreadgörüntüyü dönüştürmeye gerek kalmadan verirseniz cvtColor, zaten gri tonlamalı görüntü olarak yüklenir örn.

import numpy as np
import cv2

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

6
Bir kameradan bir görüntü çekiyorsanız: bu hatayı kameraya erişilemiyorsa alırsınız.
ger.s.brett

1
... veya video dosyanıza yanlış bir yol sağlarsanız; P Lanet windows yolunu bozduğumda bu sorunla karşılaştım (C: // yerine c: / yazarak)
fanny

17

Lütfen aşağıdaki gibi ayarlayın

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)

Yukarıdaki kod satırı, sonuna eklenen 0 nedeniyle görüntünüzü gri tonlamalı renk modelinde okur. Ve zaten gri olan bir görüntüyü tekrar gri görüntüye dönüştürmeye çalışırsanız, bu hatayı gösterecektir.

Bu yüzden ya yukarıdaki stili kullanın ya da altı belirtilen kodu deneyin:

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


4

Kontrol etmeniz gereken ilk şey, görüntünün kök dizinde olup olmadığıdır. Bunun nedeni çoğunlukla yüksekliği = 0 cv2.imread(imageName)olan görüntüdür. Bu, görüntüyü okumadığı anlamına gelir .


Bu cevap sorunumu çözüyor - videoyu okudum, video bittiğinde otomatik olarak durmuyor, bu yüzden cv2.cvtColorboş çerçeve için çalışırken aynı hatayı alıyorum .
Mikhail_Sam

3

Diğer yanıtlarda belirtilen 0 veya 1 bayraklarıyla tamamen ilgisiz nedenlerden dolayı bu hata mesajını görüyorum. Siz de görüyor olabilirsiniz çünkü cv2.imreadilettiğiniz yol dizesi bir resim değilse hata yapmayacaktır:

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

Yani cvtColoraslında sessiz bir hata olduğunda bir başarısızlık görüyorsunuz imread. Bir dahaki sefere hayatının bir saatini bu şifreli metaforla boşa harcadığında bunu unutma .

Çözüm

Yol dizenizin geçerli bir dosyayı temsil edip etmediğini kontrol etmeniz gerekebilir 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)

Bu şekilde yazıldığında kodunuz sorunsuz bir şekilde başarısız olur.


1

Bu cevap, kameraya erişmeye çalışırken aynı sorunu yaşayan kişiler içinse.

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 Kullanmak:

Kameraya bilgisayarınızdan erişmeye çalışıyorsanız, büyük olasılıkla bir izin sorunu vardır, python komut dosyasını sudo ile çalıştırmayı deneyin, düzeltmelidir.

sudo python python_script.py

Kameranın erişilebilir olup olmadığını test etmek için aşağıdaki komutu çalıştırın.

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

Yukarıdaki hata, geçersiz bir resim adından veya dosyanın yerel dizinde bulunmadığından kaynaklanır.

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

Ayrıca cv2.imread () 'in 2. argümanını' 0 'olarak kullanıyorsanız, o zaman zaten gri tonlamalı bir resme dönüştürülmüştür.

Görüntüyü parametre olarak 0 değerini ileterek dönüştürmekle aşağıdakileri uygulamak arasındaki fark:

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

bu durumda img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), görüntülerin 8uC1 ve 32sC1 tipi görüntüler olmasıdır.


1

Kameraya erişmeye çalışırken aynı sorunu yaşayanlar için bu kod bir güvenlik kontrolü ile yazılabilir.

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

VEYA kamerayı kapatmak istemeniz / çerçevenin kendisiyle ilgili bir sorun olması durumunda devam etmemeniz durumunda

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

Referans için https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36


0

Kendi görüntü kümelerimi .jpgformatta kullandığımda gözlemlediğim şey şu . Opencv belgesinde bulunan örnek komut dosyasında , aşağıdaki gibi undistortve crop the imagesatırlarına sahip olduğuna dikkat edin :

# 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)

Bu yüzden kodu ilk kez çalıştırdığımızda , mevcut dizine cv2.imwrite('calibresult.jpg',dst)bir görüntü kaydeden satırı çalıştırır calibresult.jpg. Bu yüzden, kodu bir dahaki sefere çalıştırdığımda, kamerayı jpg formatında kalibre etmek için kullandığım örnek resim kümelerimle birlikte, kod calibresult.jpg, hatanın ortaya çıkması nedeniyle bu yeni eklenen resmi de dikkate almaya çalıştı.

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

Yaptığım şey şuydu: Her çalıştırmadan sonra yeni oluşturulan görüntüyü sildim ya da söylenecek pngya da tiffyazılacak görüntünün türünü alternatif olarak değiştirdim . Bu sorunu çözdü. calibresultAynı türden giriş yapıp yazmadığınızı kontrol edin . Eğer öyleyse, sadece türü değiştirin.


0

OS XI'de, cv2.imread "dosyaadı.jpg" ile başa çıkarken "dosya.adı.jpg" yi işleyemeyeceğini fark etti. Python'da acemi biri olarak henüz bir çözüm öneremiyorum, ancak François Leblanc'ın yazdığı gibi, bu daha çok sessiz bir imread hatası.

Bu nedenle, dosya adında ek bir nokta ve muhtemelen diğer işaretler ile "" (Boşluk) veya "%" vb.


0

Ayrıca, web kameranızın doğru kapanmadığını veya bir şey kullanıp kullanmadığını da buldum, o zaman CV2 aynı hatayı verecektir. Tekrar çalışması için bilgisayarımı yeniden başlatmam gerekti.


0

Bu hatayı kaldırmak için en basit çözüm komutu çalıştırmaktı

cap.release()
cv2.closeAllWindows()

Bu benim için çalıştı ve bazen arka planda çalışan eski işlemler nedeniyle çekirdeğin yeniden başlatılması gerekiyordu.

Görüntü çalışma dizininde değilse, görüntü dosyasını pwd'deki aynı klasöre yerleştirmeyi denemek için de çalışmayacaktır, çünkü başka bir kod, görüntü dosyasının veya klasörün tam yolunu sağlar.

Gelecekte bu sorunu önlemek için, istisnai işlemlerle kodlamaya çalışın, böylece rastgele bir nedenle yanlış sonlandırma olursa, yakalama aygıtı program bittikten sonra serbest bırakılır.


0

2015-05-27-191152.jpg << Görüntü formatınıza dönüp baktığımda, ara sıra .png ve .jpg arasında kafam karıştı ve aynı hatayla karşılaştım.


0

bence resim cv2.imreadokuyamadığından .jpg, değiştirmen .jpggerekiyor .png.



0

Ben de aynı sorunu yaşıyorum, ancak video kareleri almak yerine girdi resimleri almıyorum ve yukarıdaki çözüm bunun için işe yaramadı. Sorun kamera erişiminde, dizüstü bilgisayarınızın kamerası hala önceki kodunuz tarafından kullanılıyor, basitçe KERNEL'İ YENİDEN BAŞLATINIZ ve çalışacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.