1

OpenCv の python ラッパーの問題で立ち往生しています。黒いピクセルの数がしきい値よりも大きい場合に 1 を返すこの関数があります

def checkBlackPixels( img, threshold ):
    width     = img.width
    height    = img.height
    nchannels = img.nChannels
    step      = img.widthStep
    dimtot   = width * height
    data = img.imageData
    black = 0

    for i in range( 0, height ):
        for j in range( 0, width ):
            r = data[i*step + j*nchannels + 0]
            g = data[i*step + j*nchannels + 1]
            b = data[i*step + j*nchannels + 2]

     if r == 0 and g == 0 and b == 0:
         black = black + 1

     if black >= threshold * dimtot:
        return 1
     else:
        return 0  

ループ (特定の画像の各ピクセルをスキャンする) は、入力が RGB 画像の場合はうまく機能しますが、入力が単一チャネル画像の場合、次のエラーが発生します。

for j in range( width ):
TypeError: Nested sequences should have 2 or 3 dimensions

入力単一チャネル画像 (次の例では「rg」と呼ばれます) は、cvSplit と cvAbsDiff で処理された「src」と呼ばれる RGB 画像から取得されます。

cvSplit( src, r, g, b, 'NULL' )
rg = cvCreateImage( cvGetSize(src), src.depth, 1 ) # R - G
cvAbsDiff( r, g, rg )

また、問題が cvSplit から取得した差分画像に起因することにも既に気付きました...

誰でも私を助けることができますか?ありがとうございました

4

2 に答える 2

5

widthStepIplImage オブジェクトの有効な属性でimageDataはなくなりました。したがって、各ピクセルをループしてその色の値を取得する正しい方法は次のようになります。

for i in range(0, height):
    for j in range(0, width):

        pixel_value = cv.Get2D(img, i, j)
        # Since OpenCV loads color images in BGR, not RGB
        b = pixel_value[0]
        g = pixel_value[1]
        r = pixel_value[2]

        #  cv.Set2D(result, i, j, value)
        #  ^ to store results of per-pixel
        #    operations at (i, j) in 'result' image

これが役に立つことを願っています。

于 2011-12-10T13:06:59.157 に答える
3

OpenCV のどのバージョンとどの Python ラッパーを使用していますか? ライブラリに付属の Python インターフェイスで OpenCV 2.1 または 2.2 を使用することをお勧めします。

また、ピクセルを手動でスキャンすることは避け、代わりに OpenCV が提供する低レベル関数を使用することをお勧めします ( OpenCV ドキュメントの配列に対する操作の部分を参照してください)。そうすれば、エラーが発生しにくくなり、はるかに高速になります。

単一チャネル画像または COI が設定されたカラー画像の黒いピクセルの数をカウントしたい場合 (カラー画像が実質的に単一チャネル画像として処理されるようにするため)、関数CountNonZeroを使用できます。

def countBlackPixels(grayImg):
    (w,h) = cv.GetSize(grayImg)
    size = w * h
    return size - cv.CountNonZero(grayImg)
于 2011-01-15T03:49:49.417 に答える