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


89

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

私はすでにここを検索しましたが、1つの答えは、行、列、奥行きの3つの次元を持つ必要があるため、写真を間違った方法でロードしている可能性があることを示しています。

img.shapeを印刷すると、2つの数値しか返されないので、間違っているはずです。しかし、写真を読み込む正しい方法がわかりません。


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

私もこの問題を抱えてい.../eclipse\ footage/...ましたが、パスにスペース()が含まれていることがわかりました。したがって、追加し...,0)ても修正されませんでした。
コーディ

回答:


102

スラッシュを使用して画像の完全なパスを指定します。それは私のためにエラーを解決しました。

例えば

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画像のロード中に2番目のパラメーターを指定した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 2017

...または、ビデオファイルに間違ったパスを指定した場合; P damn-windowsパスをめちゃくちゃにしてこの問題に遭遇しました(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

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

4

最初に確認する必要があるのは、イメージがルートディレクトリに存在するかどうかです。これは主に高さ= 0の画像が原因cv2.imread(imageName)です。つまり、画像を読み取っていません。


この答えは私の問題を解決します-ビデオを読みましたが、ビデオが終了しても自動的に停止しないcv2.cvtColorため、空のフレームに対して同じエラーが発生します。
Mikhail_Sam

2

他の回答で言及されているフラグ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)

このように記述されると、コードは正常に失敗します。


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の使用:

コンピューターからカメラにアクセスしようとしている場合は、権限の問題が発生している可能性が高いため、sudoを使用してpythonスクリプトを実行してみてください。

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)

また、cv2.imread()の2番目の引数を「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で利用可能なサンプルスクリプトでは、次のようにundistortand 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

私がしたこと:私は、実行するたびに新しく生成された画像を単に削除するか、または画像のタイプを言うpngtiffタイプに変更しました。それで問題は解決しました。calibresult同じタイプの入力と書き込みを行っていないか確認してください。その場合は、タイプを変更してください。


0

OS XIでは、cv2.imreadは「filename.jpg」を処理できますが、「file.name.jpg」は処理できません。私はpythonの初心者なので、まだ解決策を提案することはできませんが、FrançoisLeblancが書いたように、それはサイレントエラーのようなものです。

そのため、ファイル名にドットが追加されていたり、「」(スペース)や「%」などの他の記号が問題となっている可能性があります。


0

私はまたあなたのウェブカメラが正しく閉じなかった、または何かがそれを使用している場合、CV2はこれと同じエラーを出します。PCを再起動するには、PCを再起動する必要がありました。


0

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

cap.release()
cv2.closeAllWindows()

これは私にとってはうまくいき、古いプロセスがバックグラウンドで実行されているため、カーネルの再起動が必要になることもありました。

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

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


0

2015-05-27-191152.jpg <<画像形式を振り返ってみると、.pngと.jpgを混同していて、同じエラーが発生することがあります。


0

ので、私はそれを考えてcv2.imread読むことができない.jpg画像を、あなたは変更する必要がある.jpg.png

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.