私は現在、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つの数字だけが返されるので、間違っている必要があります。しかし、私は自分の写真を読み込む正しい方法がわかりません。
スラッシュを付けてイメージのフルパスを指定します。それは私のためにエラーを解決しました。
例えば。
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)
以下のように設定してください
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
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)
最初に確認する必要があるのは、イメージがルートディレクトリに存在するかどうかです。これは、height = 0のimageが原因です。これは、cv2.imread(imageName)
が画像を読んでいないことを意味します。
画像の名前のみを渡します。0
は必要ありません。
img=cv2.imread('sample.jpg')
他の回答で言及されているフラグ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)
このように書かれて、あなたのコードは上品に失敗するでしょう。
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タイプの画像です。
カメラにアクセスしようとしている同じ問題を経験している人々のためにこの答え。
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
カメラにアクセスしようとして同じ問題を経験している人のためのこのコードは安全チェックで書かれるかもしれません。
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
私はまたあなたのウェブカメラが正しく閉じなかったか何かがそれを使用しているかどうか、そしてCV2はこれと同じエラーを出すでしょう。私はそれが再び動作するようにするために私のPCを再起動しなければなりませんでした。
そのエラーを取り除く最も簡単な解決策は、コマンドを実行することでした。
cap.release()
cv2.closeAllWindows()
それは私にとってはうまくいったし、バックグラウンドで古いプロセスが走っていたためにカーネルを再起動する必要があった。
画像が作業ディレクトリにない場合は、そのほかのコードが存在するため、同じフォルダ内のpwdに画像ファイルを配置しようとしても機能しません。画像ファイルまたはフォルダへのフルパスを指定します。
将来この問題を回避するには、何らかの不規則な理由で誤った終了が発生した場合に、プログラムの終了後にキャプチャデバイスが解放されるように、例外処理を使用してコーディングしてください。
2015-05-27-191152.jpg <<あなたの画像フォーマットを振り返ってみると、私は時々.pngと.jpgを混同して同じエラーに遭遇しました。
これが私が.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
を入力しているかどうかを確認してください。もしそうなら、単にタイプを変更してください。
OS Xでは、cv2.imreadは "filename.jpg"を扱うことができますが、 "file.name.jpg"を処理できないことに気付きました。 pythonの初心者なので、私はまだ解決策を提案することはできませんが、FrançoisLeblancが書いたように、それはもっと静かな暗黙の誤りです。
そのため、 ""(スペース)や "%"などの場合と同様に、ファイル名にドットが追加されたり、他の記号が表示されたりする可能性があります。
cv2.imread
は.jpg
の写真を読めないので、.jpg
を.png
に変更する必要があると思います。