質問

キャプチャ(ウェブカメラ)から取得した画像を変換し、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 画像であることを再確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top