輪郭を認識する

ここまでやってきたことは

1. cvCreateImageによるIplImageの生成
2. cvCvtColorによるグレイスケール画像の生成
3. (cvThreshold又はcvAdaptiveThreshold)による画像の2値化処理

だが、これらは全てOpenCVで最も美味しい機能の一つであろう、輪郭の検出を行うための前処理である。

cvFindContours

findcontours - Structural Analysis and Shape Descriptors ― OpenCV 2.0 C Reference

int cvFindContours(CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0, 0))

cvFindContoursは最も美味しい機能の一つだが、それだけに指定するパラメタも多く複雑である。

また、それまで使っていなかった

  • CvMemStorage
  • CvContour

これらの型を使うのも話をいっそう面倒にしている。

CvMemStorageはシーケンスや輪郭,細分化データなどのopenCVで使われる画像データを格納するためのポインタリストであり、cvFindContoursでも検出した輪郭のデータがCvContour型としてセットされる。
CvContour型はOpenCVの様々なファンクションで使われている輪郭の座標集合を格納する型であり、cvFindContoursでも指定されたパラメタに従って輪郭の情報が階層的に格納される。

cvFindContoursが面倒なのは、第5引数であるmodeによってCvMemStorageCvContourが格納される際の構造が変わることだ。

次回以降、実際にcvFindContoursを使っていこうと思う。