2019年2月25日月曜日

歩行者認識をやってみた。

ずっと忙しくして、ブログを更新するのを忘れてました。
最近ちょっと暇になったので久しぶりにブログを更新。

おじさん、この前、防犯カメラを作っている会社に会社見学行ってきました。
最近の防犯カメラってすごいね。カメラの画像から人がどこにいるかわかるらしい。
車の自動運転のデモでもよくみかけますね。
昔このブログで歩行者認識やりますといって書いてなかった気もします。


あれどうやってんだろね。
調べてみるとなんかHOGとかで特徴検出してSVMで学習させてるらしい。
これならおじさんのラズパイでも作れる!
というわけで、作ってみました。
いつものようにラズパイとかでも動くように、C++言語で実装。
以前ブログで書いた、OpenCVのライブラリから必要な部分だけを抜き出して最小のOpenCVで実装しています。

ねっとに落っこちている適当な画像で試してみました。



歩行者以外も検出しまくり!!
どうもパラメーター調整をしないと誤検出してしまうようです。
みんないい結果だけ乗せるんだから。

-------------
#include <stdio.h>
#include <vector>

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

#include "core.hpp"
#include "imgproc.hpp"
#include "objdetect.hpp"

#include "stb_image.h"
#include "stb_image_write.h"

#define X_DIV 10
#define Y_DIV 10



using namespace std;


void changeb_g(unsigned char* p, int x, int y, int c)
{
int ct = x*y;
int i;
unsigned char t;
for (i = 0; i < ct; i++) {
t = p[0];
p[0] = p[2];
p[2] = t;
p[3] = 255;
p += c;
}
}

int main()
{
unsigned char*p;
int x = -1, y = -1;
int n, m;
int i;

//load image
//p = stbi_load("dave.jpg", &x, &y, &n, 4);
p = stbi_load("test.jpg", &x, &y, &n, 4);
if (p == NULL || x < 1 || y < 1)return 1;

// R<-->B
changeb_g(p, x, y, 4);


cv::Mat color = cv::Mat(y, x, CV_8UC4);
cv::Mat gray;


//copy data
memcpy(color.data, p, x * 4 * y);
stbi_image_free(p);


cv::cvtColor(color, gray, CV_BGR2GRAY);

cv::HOGDescriptor hog = cv::HOGDescriptor(cv::Size(48, 96), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9);
hog.setSVMDetector(hog.getDaimlerPeopleDetector());


vector<cv::Rect> people;

hog.detectMultiScale(gray, people);

for (auto it = people.begin(); it != people.end(); it++){
cv::rectangle(color,it->tl(),it->br(),cv::Scalar(0,255,0),1,8,0);
}
//for (i = 0; i < n; i++){
// cv::line(color, cv::Point(lines[i][0], lines[i][1]), cv::Point(lines[i][2], lines[i][3]), cv::Scalar(0, 0, 255), 2);
//}

changeb_g(color.data, x, y, 4);
stbi_write_png("result.png", x, y, 4, color.data, 4 * x);

return 0;
}



-------------

というわけで簡単な歩行者検出でした。



0 件のコメント:

コメントを投稿