Python / OpenCV:キャプチャから取得した画像の変換
質問
キャプチャ(ウェブカメラ)から取得した画像を変換し、OpenCVで処理しようとしていますが、時間がかかります。
画像をグレースケールに変換しようとすると、プログラムがクラッシュします。 (Python.exeは動作を停止しました)
ここに私のコードのメインスニペットがあります:
newFrameImageGS = cv.CreateImage ((320, 240), cv.IPL_DEPTH_8U, 1)
for i in range(0,5):
newFrameImage = cv.QueryFrame(ps3eye)
cv.CvtColor(newFrameImage,newFrameImageGS,cv.CV_BGR2GRAY)
golfSwing.append(newFrameImageGS)
cvConvertScaleを使用しようとすると、アサーションエラーが表示されます:
src.size() == dst.size() && src.channels() == dst.channels()
これは理にかなっていますが、ウェブカメラの入力画像をcvUpdateMotionHistory()やcvCalcOpticalFlowLK()などの関数で使用できる画像に変換する方法についてかなり混乱しています
アイデアはありますか?ありがとう。
更新:
これで手動で画像をグレースケールに変換しました:
for row in range(0,newFrameImage.height):
for col in range(0,newFrameImage.width):
newFrameImageGS[row,col] = (newFrameImage8U[row,col][0] * 0.114 + # B
newFrameImage8U[row,col][1] * 0.587 + # G
newFrameImage8U[row,col][2] * 0.299) # R
しかし、これにはかなり時間がかかります..なぜcvCvtColorがプログラムのクラッシュを引き起こしているのか、まだわかりません。
解決
何らかの理由で、CvtColorは、画像の深度が8ビットのときにプログラムをクラッシュさせました。 32ビットに変換すると、プログラムはクラッシュせず、すべてが正常に動作するように見えました。これがなぜなのかわかりませんが、少なくとも現在は動作しています。
newFrameImage = cv.QueryFrame(ps3eye)
newFrameImage32F = cv.CreateImage((320, 240), cv.IPL_DEPTH_32F, 3)
cv.ConvertScale(newFrameImage,newFrameImage32F)
newFrameImageGS_32F = cv.CreateImage ((320,240), cv.IPL_DEPTH_32F, 1)
cv.CvtColor(newFrameImage32F,newFrameImageGS_32F,cv.CV_RGB2GRAY)
newFrameImageGS = cv.CreateImage ((320,240), cv.IPL_DEPTH_8U, 1)
cv.ConvertScale(newFrameImageGS_32F,newFrameImageGS)
他のヒント
ここによくある間違いがあります:
ループの 変数の newFrameImageGS
変数に単一の画像を作成し、ループ内のコンテンツを上書きして、リストに追加します。結果は期待したものにはなりません。リストにはオブジェクト参照のみが追加され、オブジェクトのコピーはこのように作成されないため、リストには最後に同じイメージインスタンスへの5つの参照が含まれます。この画像には最後のフレームが含まれるので、結果としてそのフレームのうち5つが得られますが、これは望んでいないものです。不明な場合は、Pythonチュートリアルを確認してください。これを解決するには、上記のコードの最初の行をforループの本文に移動します。
上記を修正しても役に立たない場合の別の可能性:
CvtColor
関数は、異なる数のチャンネルに変換できるため、グレースケールへの変換に適しているようです。
このマニュアルによれば、 CvtColor
関数には、ソースと同じデータ型の宛先イメージが必要です。 newFrameImage
が IPL_DEPTH_8U
画像であることを再確認してください。