2011-01-14 8 views
1

OpenCv用のPythonラッパーの問題が残っています。 I黒画素数がPythonのOpenCVでピクセルをスキャンできない

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 画像である場合、良好な動作をtresholdよりも大きい場合に1を返し、この機能を持っている...しかし入力が単一チャネル画像である場合、私はこのエラーを取得する:(次の例では「RG」と呼ばれる)入力単一チャネル画像を から取得され

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

「SRC」と呼ばれるRGB画像はcvSplitで処理し、その後、cvAbsDiff

cvSplit(src, r, g, b, 'NULL') 
rg = cvCreateImage(cvGetSize(src), src.depth, 1) # R - G 
cvAbsDiff(r, g, rg) 
私もすでに問題が差分画像から来ていることに気づいたcvSplitから持って

...

誰もが私を助けることができますか? ありがとう

+0

ネストされたシーケンスのコードで何も見ないので、 'TypeError:ネストされたシーケンスは2次元または3次元であるべきです 'というエラーメッセージは意味をなさない。 – martineau

+0

それは事実です!しかし、carnieriから提案されたトリックは良い作品です。 –

答えて

2

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

ピクセルを手動でスキャンするのではなく、OpenCVによって提供される低レベルの機能を使用することをお勧めします(OpenCVドキュメントのOperations on Arraysを参照)。そのようにすれば、エラーが発生しにくくなり、と多くの場合、が高速になります。

単一チャネルイメージまたはCOIが設定されたカラーイメージ(カラーイメージが単一チャネルのイメージとして効果的に扱われるように)で黒ピクセルの数をカウントする場合は、機能CountNonZero

def countBlackPixels(grayImg): 
    (w,h) = cv.GetSize(grayImg) 
    size = w * h 
    return size - cv.CountNonZero(grayImg) 
+0

ありがとうございます!私はすべての夜をOpenCvのドキュメントに費やしましたが、私が見落とした唯一の機能はCountNonZeroです... これは完璧です。ありがとうございました –

3

widthStepimageDataはもはやIplImage型のオブジェクトに対して有効な属性ではありません。したがって、各ピクセルをループして色値を取得する正しい方法は、

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 

となります。

関連する問題