web-dev-qa-db-ja.com

オープンCVエラー:(-215)scn == 3 ||関数cvtColorのscn == 4

私は現在、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

私はすでにここを検索しました、そしてある答えは私が私の写真を間違った方法でロードすることができると言いました。

Img.shapeを印刷すると、2つの数字だけが返されるので、間違っている必要があります。しかし、私は自分の写真を読み込む正しい方法がわかりません。

81
arthurckl

スラッシュを付けてイメージのフルパスを指定します。それは私のためにエラーを解決しました。

例えば。

import numpy as np
import cv2

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

また、cvtColorを使用してimageを変換する必要がないより0を使用してimageをロードする間に2番目のパラメータでcv2.imreadを与えるなら、それはすでにグレースケールimageとしてロードされます、例えば。

import numpy as np
import cv2

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

以下のように設定してください

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
17
Kalarav Parmar
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)
5
Gurkamal

最初に確認する必要があるのは、イメージがルートディレクトリに存在するかどうかです。これは、height = 0のimageが原因です。これは、cv2.imread(imageName)が画像を読んでいないことを意味します。

4
Farooq Khan

画像の名前のみを渡します。0は必要ありません。

img=cv2.imread('sample.jpg')
4

他の回答で言及されているフラグ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のエラーであるときに見られます。次回は、その不可解な隠喩を使ってあなたの人生の1時間を無駄にすることになることを覚えておいてください

溶液

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)

このように書かれて、あなたのコードは上品に失敗するでしょう。

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

また、cv2.imread()の2番目の引数を '0'として使用している場合は、すでにグレースケール画像に変換されています。

パラメータとして0を渡すことによってイメージを変換することと、以下を適用することの違い:

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

つまり、img = cv2.cvtCOLOR(img, cv2.COLOR_BGR2GRAY)の場合、画像は8uC1と32sC1タイプの画像です。

1
Shikhar Johri

カメラにアクセスしようとしている同じ問題を経験している人々のためにこの答え。

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を使用する

あなたがコンピュータからカメラにアクセスしようとしているのであれば、おそらくパーミッションの問題があるのであれば、Sudoでpythonスクリプトを実行してみてください。

Sudo python python_script.py

カメラがアクセス可能かどうかをテストするには、次のコマンドを実行します。

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

カメラにアクセスしようとして同じ問題を経験している人のためのこのコードは安全チェックで書かれるかもしれません。

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

1
Vivek Patwari

私はまたあなたのウェブカメラが正しく閉じなかったか何かがそれを使用しているかどうか、そしてCV2はこれと同じエラーを出すでしょう。私はそれが再び動作するようにするために私のPCを再起動しなければなりませんでした。

0
MNM

そのエラーを取り除く最も簡単な解決策は、コマンドを実行することでした。

cap.release()
cv2.closeAllWindows()

それは私にとってはうまくいったし、バックグラウンドで古いプロセスが走っていたためにカーネルを再起動する必要があった。

画像が作業ディレクトリにない場合は、そのほかのコードが存在するため、同じフォルダ内のpwdに画像ファイルを配置しようとしても機能しません。画像ファイルまたはフォルダへのフルパスを指定します。

将来この問題を回避するには、何らかの不規則な理由で誤った終了が発生した場合に、プログラムの終了後にキャプチャデバイスが解放されるように、例外処理を使用してコーディングしてください。

0
Vinay Verma

2015-05-27-191152.jpg <<あなたの画像フォーマットを振り返ってみると、私は時々.pngと.jpgを混同して同じエラーに遭遇しました。

0
Hong Son Nguyen

これが私が.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)

そのため、最初にコードを実行すると、現在のディレクトリにイメージcalibresult.jpgを保存する行cv2.imwrite('calibresult.jpg',dst)が実行されます。そのため、次にコードを実行したときに、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
Bhanu Chander

OS Xでは、cv2.imreadは "filename.jpg"を扱うことができますが、 "file.name.jpg"を処理できないことに気付きました。 pythonの初心者なので、私はまだ解決策を提案することはできませんが、FrançoisLeblancが書いたように、それはもっと静かな暗黙の誤りです。

そのため、 ""(スペース)や "%"などの場合と同様に、ファイル名にドットが追加されたり、他の記号が表示されたりする可能性があります。

0
Francis

cv2.imread.jpgの写真を読めないので、.jpg.pngに変更する必要があると思います。

0
shenmeme