buka kesalahan cv: (-215) scn == 3 || scn == 4 dalam fungsi cvtColor


91

Saya saat ini menggunakan Ubuntu 14.04, menggunakan python 2.7 dan cv2.

Ketika saya menjalankan kode ini:

import numpy as np
import cv2

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

itu kembali:

 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

Saya sudah mencari di sini dan satu jawaban mengatakan bahwa saya dapat memuat foto saya dengan cara yang salah, karena seharusnya memiliki 3 dimensi: baris, kolom, dan kedalaman.

Ketika saya mencetak img.shape, ia hanya mengembalikan dua angka, jadi saya pasti salah melakukannya. Tapi saya tidak tahu cara yang benar untuk memuat foto saya.


11
img = cv2.imread('2015-05-27-191152.jpg',0)parameter 0 sudah memuat gambar Anda sebagai gambar grayscale 1 saluran. Jadi cobalah img = cv2.imread('2015-05-27-191152.jpg')atau gray = cv2.imread('2015-05-27-191152.jpg',0)lihat bendera yang berbeda di: docs.opencv.org/modules/highgui/doc/…
Micka

Saya juga mengalami masalah ini, tetapi ternyata ada spasi ( .../eclipse\ footage/...) di jalur saya. Jadi menambahkan ...,0)tidak memperbaikinya.
Cody

Jawaban:


104

Beri gambar path lengkap dengan garis miring ke depan. Itu memecahkan kesalahan untuk saya.

Misalnya

import numpy as np
import cv2

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

Juga, jika Anda memberikan 0parameter kedua saat memuat gambar menggunakan cv2.imreaddaripada tidak perlu mengkonversi gambar menggunakan cvtColor, itu sudah dimuat sebagai gambar grayscale misalnya.

import numpy as np
import cv2

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

6
Jika Anda mengambil gambar dari kamera: Anda mendapatkan kesalahan ini jika kamera tidak dapat diakses.
ger.s.brett

1
... atau jika Anda memberikan jalur yang salah ke file video Anda; P Saya mengalami masalah ini ketika saya mengacaukan jalur windows-sialan (menulis c: / bukan C: //)
fanny

17

Harap Diatur Seperti Di Bawah Ini

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)

Baris kode di atas membaca gambar Anda dalam model warna grayscale, karena 0 ditambahkan di akhir. Dan jika Anda mencoba lagi untuk mengubah gambar yang sudah abu-abu menjadi gambar abu-abu, itu akan menunjukkan kesalahan itu.

Jadi gunakan gaya di atas atau coba kode yang kurang disebutkan:

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


4

Hal pertama yang harus Anda periksa adalah apakah gambar tersebut ada di direktori root atau tidak. Hal ini sebagian besar disebabkan oleh gambar dengan tinggi = 0. Artinya cv2.imread(imageName)gambar tidak terbaca.


Jawaban ini menyelesaikan masalah saya - Saya membaca video, itu tidak berhenti secara otomatis ketika video berakhir, jadi saya mendapatkan kesalahan yang sama mencoba cv2.cvtColoruntuk bingkai kosong.
Mikhail_Sam

3

Saya mendapat pesan kesalahan ini muncul, karena alasan yang sama sekali tidak terkait dengan tanda 0 atau 1 yang disebutkan di jawaban lain. Anda mungkin melihatnya juga karena tidakcv2.imread akan error jika string jalur yang Anda berikan itu bukan gambar:

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

Jadi Anda melihat cvtColorkegagalan padahal sebenarnya itu adalah silent imreaderror. Ingatlah hal itu jika lain kali Anda membuang-buang satu jam hidup Anda dengan metafora samar itu .

Larutan

Anda mungkin perlu memeriksa apakah string jalur Anda mewakili file yang valid sebelum meneruskannya ke 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)

Ditulis dengan cara ini, kode Anda akan gagal dengan baik.


1

Jawaban ini jika untuk orang-orang yang mengalami masalah yang sama mencoba mengakses kamera.

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

Menggunakan Linux:

jika Anda mencoba mengakses kamera dari komputer Anda kemungkinan besar ada masalah izin, coba jalankan skrip python dengan sudo itu harus memperbaikinya.

sudo python python_script.py

Untuk menguji apakah kamera dapat diakses, jalankan perintah berikut.

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

Kesalahan di atas adalah hasil dari nama gambar yang tidak valid atau jika file tidak ada di direktori lokal.

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

Juga jika Anda menggunakan argumen ke-2 dari cv2.imread () sebagai '0', maka itu sudah diubah menjadi gambar grayscaled.

Perbedaan antara mengonversi gambar dengan meneruskan 0 sebagai parameter dan menerapkan berikut ini:

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

adalah, dalam kasus ini img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY), gambar tersebut adalah gambar jenis 8uC1 dan 32sC1.


1

Kode ini untuk mereka yang mengalami masalah yang sama saat mencoba mengakses kamera dapat ditulis dengan pemeriksaan keamanan.

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

ATAU jika Anda ingin menutup kamera / menghentikan jika akan ada masalah dengan frame itu sendiri

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

Untuk referensi https://github.com/HackerShackOfficial/AI-Smart-Mirror/issues/36


0

Inilah yang saya amati ketika saya menggunakan kumpulan gambar saya sendiri dalam .jpgformat. Dalam contoh skrip yang tersedia di dokumen Opencv , perhatikan bahwa ia memiliki undistortdan crop the imagebaris seperti di bawah ini:

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

Jadi, ketika kita menjalankan kode untuk pertama kali, itu mengeksekusi baris yang cv2.imwrite('calibresult.jpg',dst)menyimpan gambar calibresult.jpgdi direktori saat ini. Jadi, ketika saya menjalankan kode untuk waktu berikutnya, bersama dengan kumpulan gambar sampel saya yang saya gunakan untuk mengkalibrasi kamera dalam format jpg, kode tersebut juga mencoba mempertimbangkan gambar yang baru ditambahkan ini calibresult.jpgkarena kesalahannya muncul.

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

Apa yang saya lakukan adalah: Saya cukup menghapus gambar yang baru dibuat setelah setiap proses atau sebagai alternatif mengubah jenis gambar untuk dikatakan pngatau tiffdiketik. Itu memecahkan masalah. Periksa apakah Anda memasukkan dan menulis calibresultdengan jenis yang sama. Jika demikian, ubah saja tipenya.


0

Pada OS XI menyadari, bahwa sementara cv2.imread dapat menangani "nama file.jpg" itu tidak dapat memproses "nama file.jpg". Menjadi pemula untuk python, saya belum bisa mengusulkan solusi, tetapi seperti yang ditulis oleh François Leblanc, itu lebih merupakan kesalahan imread yang diam-diam.

Jadi ada masalah dengan titik tambahan di nama file dan kemungkinan tanda lain juga, seperti dengan "" (Spasi) atau "%" dan seterusnya.


0

Saya juga menemukan jika webcam Anda tidak menutup dengan benar atau ada sesuatu yang menggunakannya, maka CV2 akan memberikan kesalahan yang sama. Saya harus me-restart pc saya agar berfungsi lagi.


0

Solusi paling sederhana untuk menghapus kesalahan itu menjalankan perintah

cap.release()
cv2.closeAllWindows()

Itu berhasil untuk saya dan terkadang juga perlu memulai ulang kernel karena proses lama berjalan di latar belakang.

Jika gambar tidak ada di direktori kerja maka itu juga tidak akan berfungsi untuk itu coba letakkan file gambar di pwd di folder yang sama karena ada kode lain yang memberikan jalur lengkap ke file atau folder gambar.

Untuk menghindari masalah ini di masa mendatang, cobalah membuat kode dengan penanganan yang luar biasa sehingga jika penghentian yang salah terjadi karena beberapa alasan acak, perangkat penangkap akan dilepaskan setelah program selesai.


0

2015-05-27-191152.jpg << Melihat kembali format gambar Anda, terkadang saya bingung antara .png dan .jpg dan mengalami kesalahan yang sama.


0

Saya pikir itu karena cv2.imreadtidak bisa membaca .jpggambar, Anda perlu mengganti .jpgke .png.


0

Dalam kasus saya, kesalahan diselesaikan dengan bermigrasi ke OpenCV 4.0 (atau lebih tinggi).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.