2014-01-17 9 views
8

私は動画内の動く物体の追跡に成功しました。 http://ww1.sinaimg.cn/mw690/63a9e398jw1ecn39e3togj20jv0g1gnv.jpgOpenCV:HOGDescriptor :: detectメソッドの使い方

しかし、オブジェクトが人であるかどうかを判断したいと思います。私はOpenCVでHOGDescriptorを試しました。 HOGDescriptorには、人を検出する方法として、HOGDescriptor::detectHOGDescriptor::detectMultiScaleがあります。 OpenCV "sources \ samples \ cpp \ peopledetect.cpp"は、画像をさまざまなスケールで検索して非常に遅いHOGDescriptor::detectMultiScaleの使用方法を示しています。

私の場合、私は四角形のオブジェクトを追跡しました。私はHOGDescriptor::detectを使用して矩形の内部を検出する方がはるかに迅速になると思います。しかし、OpenCVのドキュメントにはgpu::HOGDescriptor::detectしかありません(私はまだそれを使用する方法を推測できません)。HOGDescriptor::detectが見つかりませんでした。私はHOGDescriptor::detectを使いたいです。

誰でも私に、HOGDescriptor::detectの使用法を示すいくつかのC++コードスニペットを提供できますか?

ありがとうございました。

答えて

10

すでにオブジェクトのリストがあるので、すべてのオブジェクトに対してHOGDescriptor::detectメソッドを呼び出して、出力foundLocations配列をチェックすることができます。空でない場合、オブジェクトは人物として分類されます。唯一のことは、HOGは、あなたのオブジェクトを再スケールする必要があるので、デフォルトで64x128窓で動作するということです。

std::vector<cv::Rect> movingObjects = ...; 

cv::HOGDescriptor hog; 
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); 
std::vector<cv::Point> foundLocations; 
for (size_t i = 0; i < movingObjects.size(); ++i) 
{ 
    cv::Mat roi = image(movingObjects[i]); 
    cv::Mat window; 
    cv::resize(roi, window, cv::Size(64, 128)); 
    hog.detect(window, foundLocations); 
    if (!foundLocations.empty()) 
    { 
     // movingObjects[i] is a person 
    } 
} 
+0

それは完璧に動作します! – gouchaoer

1
  • あなたはCUDAとOpenCVのをCMakeのない場合は、gpu::HOGDescriptor::detectHOGDescriptor::detectを呼び出すと等しくなります呼び出して、有効になって。 GPUは呼び出されません。

  • また、コードのために、あなたは

    GpuMat img; 
    vector<Point> found_locations; 
    gpu::HOGDescriptor::detect(img, found_locations); 
    if(!found_locations.empty()) 
    { 
        // img contains/is a real person 
    } 
    

編集を使用することができます。

は、しかし、私は、オブジェクトが人であるかどうかを決定します。

この手順が必要ではないと思います。 HOGDescriptor::detect自体は人を検出するために使用されるため、設定に従った人物であるはずの人物を確認する必要はありません。一方、検出された品質を制御するためにしきい値を設定することができます。

+0

あなたが提供されているサンプルコードはHOGDescriptor :: detectMultiScale' 'についてです、と私は' HOGDescriptor :: detect'が必要。 – gouchaoer

+1

私は 'HOGDescriptor :: detect'ではなく、動いているオブジェクトを追跡するためにフォアグラウンド/バックグラウンドセグメント化を使用します。だから私は、移動するオブジェクトが人であるかどうかを判断する必要があります。 – gouchaoer

+0

@ gouchaoerそして、これらの動くオブジェクトに対して 'HOGDescriptor :: detectMultiScale'を実行する必要があります。 – herohuyongtao