2019年2月27日水曜日

信号機認識をやってみた。

おじさん、前回は歩行者認識をやったので、今回は調子に乗って信号機認識をやってみたいと思います。


信号機認識ってどうやってやるんだろうね。
信号機認識,OpenCVとかで検索しても全くソースコードが出てきません。
なんてこった。これじゃあコピペで作れないじゃん。
日本人で作ってるひとあまりいないのね。
検索で出てこないってことは難しいんだ・・・。

でもわかったことは、歩行者認識のようにOpenCVにデフォルトで入っているDetectorを使う場合はなにもいらないのですが、信号機認識のようにOpenCVにデフォルトで入っていDetectorを使う場合は、学習済みデータを作るかどこからか取ってこないといけないようです。

なので英語でtraffic,light,detection,opencvと検索してネットで落ちているそれっぽいOpenCVの学習済みデータを取ってきます。

https://github.com/D-KG5/opencv
https://github.com/swaroopbelur/Traffic-Signal-Detection


きっとこのへんのデータを使えば信号機認識できるはず。
というわけでこの学習データで信号機認識をさせてみました。




おー本当に認識できんじゃん。
だけどここまでたどり着くのにかなり時間がかかてしまいました。
これほんとうに学習させるのが難しくて、日本の信号機とか他の地域の信号機はまず認識することはありません。
このようにきちんと認識できる写真を探し出すのにかなり苦労します。

この結果のあとに色識別を行うと信号機の色がわかるっぽいです。
色識別はまた別の会に書きたいと思います。


--------------------------
#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("shingo1.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::CascadeClassifier SS_cascade = cv::CascadeClassifier("traffic_light.xml");
cv::CascadeClassifier SS_cascade = cv::CascadeClassifier("TrafficLight_HAAR_16Stages.xml");


vector<cv::Rect> shingou;

SS_cascade.detectMultiScale(gray,shingou, 1.1, 1);

for (auto it = shingou.begin(); it != shingou.end(); it++){
printf("kita!!\n");
cv::rectangle(color,it->tl(),it->br(),cv::Scalar(0,255,0),1,8,0);
}

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

return 0;
}

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



0 件のコメント:

コメントを投稿