[OpenCV]CascadeClassifier::detectMultiScale

프로그래밍/그 외2018. 4. 14. 20:00

안녕하세요. 개발자 드리머즈입니다.


OpenCV에서 핵심이 되는 함수인 CascadeClassifier::detectMultiScale에 대해 살펴보겠습니다.


좀 예전 글로 보이지만 https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html 여기에 설명이 있습니다.


Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.

C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
Parameters:
  • cascade – Haar classifier cascade (OpenCV 1.x API only). It can be loaded from XML or YAML file using Load(). When the cascade is not needed anymore, release it using cvReleaseHaarClassifierCascade(&cascade).
  • image – Matrix of the type CV_8U containing an image where objects are detected.
  • objects – Vector of rectangles where each rectangle contains the detected object.
  • scaleFactor – Parameter specifying how much the image size is reduced at each image scale.
  • minNeighbors – Parameter specifying how many neighbors each candidate rectangle should have to retain it.
  • flags – Parameter with the same meaning for an old cascade as in the function cvHaarDetectObjects. It is not used for a new cascade.
  • minSize – Minimum possible object size. Objects smaller than that are ignored.
  • maxSize – Maximum possible object size. Objects larger than that are ignored.

The function is parallelized with the TBB library.


input이미지에서 크기가 다른 object를 검출(detect)하는 함수입니다. 어떤 object를 검출하는지는 CascadeClassifier 초기화 부분에서 정해집니다. 보통 얼굴 인식을 하기 위해 lbpcascade_frontalface.xml을 많이 사용합니다. 검출된 object는 rectangle의 리스트로 반환된다고 합니다.


detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())


인자의 갯수가 무려 7개입니다. (참고로 위 함수 인자중 인자값이 있는 인자들은 인자의 기본값이 있는 인자임)

첫 번째 인자인 image는 바로 검출하고자 하는 원본 이미지를 의미합니다.

두 번째 인자인 objects에 검출된 이미지가 채워집니다.

세 번쨰 인자인 scaleFactor는 이미지 피라미드에서 사용되는 scale factor를 의미합니다. (아래 참고부분의 링크 참고)

네 번째 인자인 minNeighbors는 이미지 피라미드에 의한 여러 스케일의 크기에서 minNeighbors 횟수 이상 검출된 object는 valid하게 검출할 때 쓰이는 것 같습니다.

다섯 번째 인자인 flags는 old cascade 사용시에만 의미를 가지는 파라미터로 보입니다. (https://github.com/opencv/opencv/blob/master/modules/objdetect/src/cascadedetect.cpp#L1416-L1445)

old cascade란 무엇인지 찾아보니 예전의 OpenCV(1.x버전대에 쓰이던?)에서 쓰이던 cascade 파일의 형식을 말하는 게 아닐까 추측합니다. 

https://stackoverflow.com/questions/48230968/opencv-3-4-c-cascadeclassifier-use-old-xml-file 글을 보면 old cascade파일과 아닌 것은 형식(format)이 좀 다릅니다.


old version

1
2
3
4
5
6
7
8
9
<opencv_storage>
    <Boca_17stages type_id="opencv-haar-classifier">
       <size>
        25 15</size>
       <stages>
       <_>
       <!-- stage 0 -->
          <trees>
       ...
cs


new version

1
2
3
4
5
6
7
8
<opencv_storage>
<cascade type_id="opencv-cascade-classifier"
 <stageType>BOOST</stageType>
  <featureType>HAAR</featureType>
  <height>20</height>
  <width>20</width>
  <stageParams>
  ...
cs

haar cascade가 old format이고 lbpcascade가 new format인 것 같기도 합니다. (확인이 필요함)


flags에 사용될 수 있는 인자는 https://docs.opencv.org/master/d9/d31/group__objdetect__c.html#gabb074ea5afa72bbb137bc77ce921e3a7에 있습니다.

그런데 각 인자가 무슨 의미인지는 안나와있네요.


CV_HAAR_DO_CANNY_PRUNING

CV_HAAR_DO_ROUGH_SEARCH

CV_HAAR_FEATURE_MAX

CV_HAAR_FIND_BIGGEST_OBJECT

CV_HAAR_SCALE_IMAGE


위의 5개가 flags로 사용될 수 있는 것 같습니다. 이름으로 보아.. (old version의 cascade 파일 사용 시) object를 detect할 때 방식?을 설정하는 flag 같습니다.


여섯 번째 인자인 minSize는 검출하려는 이미지의 최소 사이즈입니다. 이 크기보다 작은 object는 무시됩니다.

일곱 번째 인자인 maxSize는 검출하려는 이미지의 최대 사이즈입니다. 이 크기보다 큰 object는 무시됩니다.




참고

이미지 피라미드 설명 : http://darkpgmr.tistory.com/137

작성자

Posted by 드리머즈

관련 글

댓글 영역