

opencvのCountNonZeroを用いた下記のプログラム

[code]

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    w_num = 0
    
    img = cv2.imread("detect_0_0.jpg")
    w_num = cv2.CountNonZero(img)
    print("%d"%w_num)
    
[/code]

を実行したところ

[code]

    Traceback (most recent call last):
      File "wcount2.py", line 9, in <module>
        w_num = cv2.cv.CountNonZero(img)
    TypeError: CvArr argument 'arr' must be IplImage, CvMat or CvMatND. Use 
    fromarray() to convert numpy arrays to CvMat or cvMatND
    
[/code]

というエラーが出てきました。これを処理するにはどうしたらよいのでしょうか。  
プログラム言語はpythonです。


CC BY-SA 3.0
2017-01-06T14:49:59.960
31672
2018-01-25T01:55:15.993
2017-01-07T02:46:53.517
20022
20022
question
python opencv
opencvのCountNonZeroについて


`countNonZero()` の引数は [_"single-channel array"_
との事](http://docs.opencv.org/master/d2/de8/group__core__array.html#gaa4b89393263bb4d604e0fe5986723914)です。  
`imread` で読み込んだ場合、デフォルトでは三色（BGR）のチャンネルを持つようです。

シングルチャンネルの `array` を得るには、例えば以下のような方法が考えられます。  
（リンク先は OpenCV のドキュメントですが Python 向けの記述は無いですね。引数の順番などは少し違う場合があります）

###
[`imread`](http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)
で画像を読み込む際に[`ImreadModes`](http://docs.opencv.org/master/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80)
を指定する

[code]

    img = cv2.imread("test.png", cv2.IMREAD_GRAYSCALE)
    w_num = cv2.countNonZero(img)
    
[/code]

###
[`cvtColor`](http://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#ga397ae87e1288a81d2363b61574eb8cab)で変換する

[code]

    img = cv2.imread("test.png")
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    w_num = cv2.countNonZero(img_gray)
    
[/code]

###
[`split`](http://docs.opencv.org/master/d2/de8/group__core__array.html#ga8027f9deee1e42716be8039e5863fbd9)
でチャンネルを一つ取り出す

特定の色だけ処理する事になりますが、元々がグレースケール画像や2値画像であれば上の方法と同じ結果になるはずです。

[code]

    img = cv2.imread("test.png")
    img_ch0 = cv2.split(img)[0]
    w_num = cv2.countNonZero(img_ch0)
    
[/code]


CC BY-SA 3.0
2017-01-08T07:03:09.277
31704
2017-01-08T07:17:13.507
2017-01-08T07:17:13.507
3054
3054
31672
answer