3

キャプチャ(ウェブカメラ)から取得した画像を変換し、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()

これは理にかなっていますが、Webカメラの入力画像を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がプログラムのクラッシュを引き起こしている理由を理解できません。

4

2 に答える 2

4

何らかの理由で、画像の深度が 8 ビットの場合、CvtColor が原因でプログラムがクラッシュしました。それらを 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)
于 2009-11-27T22:20:27.683 に答える
1

ここによくある間違いがあります:

ループの前newFrameImageGSに変数に単一の画像を作成し、ループ内のその内容を上書きして、リストに追加します。結果はあなたが期待するものではありません。オブジェクト参照のみがリストに追加され、この方法で作成されたオブジェクトのコピーはないため、リストには最後に同じ画像インスタンスへの5つの参照が含まれます。この画像には最後のフレームが含まれているため、結果としてそのフレームが5つ取得されますが、これは希望どおりではないと思います。明確でない場合は、Pythonチュートリアルを確認してください。上記のコードの最初の行をforループの本体に移動することで、これを解決できます。

上記を修正しても役に立たない場合の別の可能性:

このCvtColor関数は、異なる数のチャネルに変換できるため、グレースケールに変換するための正しい関数のようです。

このマニュアルによると、このCvtColor機能には、ソースと同じデータ型の宛先イメージが必要です。newFrameImage画像であることを再確認してくださいIPL_DEPTH_8U

于 2009-11-27T15:01:50.740 に答える