main.cpp 11.4 KB
#include "../village_pic_interface.h"
#include <vector>
#include <string>
#include <iostream>
#include <dirent.h>
#include<fstream>

#include "../utils/logger.hpp"
#include "../utils/DeviceUtil.hpp"

using namespace std;

void show_result(std::vector<AnalysisResult> r, vector<string> vec_path);


void GetFileNames(string path,vector<string>& filenames)
{
    DIR *pDir;
    struct dirent* ptr;
    if(!(pDir = opendir(path.c_str()))){
        cout<<"Folder doesn't Exist!"<<endl;
        return;
    }
    while((ptr = readdir(pDir))!=0) {
        if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0){
            filenames.push_back(path + "/" + ptr->d_name);
        }
    }
    closedir(pDir);
}

vector<string> GetFilesFromFile(string file_path){

    vector<string> vec_files;

	fstream infile(file_path);

	string text;
	while (getline(infile, text)){
        // text.erase(text.size() - 1, 1);
		vec_files.push_back(text);
	}
	infile.close();

    return vec_files;
}

int main() {

    void *vaHandle = NULL;

    VillageParam param;
    param.dev_id = 0;
    param.sdk_path = ".";
    param.log_level = 1;

    string log_path = param.log_path + "/main.log";

    set_default_logger(LogLevel(param.log_level), "PicAnalysis", log_path.c_str(), param.log_mem, param.log_days);

    int ret = village_pic_init(&vaHandle, param);

    // vector<string> vec_path;
    // size_t i = 0;
    // // for (i = 1; i < 8; i++)
    // {
    //     string path = "./img/test_road";
    //     path = path + to_string(i) + ".jpg";
    //     vec_path.push_back(path);
    // }



    vector<string> vec_path;
    // GetFileNames("/home/share/data/villiage_test/test3", vec_path);

    // vec_path = GetFilesFromFile("./files1.log");

    {
        string path = "/home/share/data/villiage_test/test3/192.168.10.67_01_20230601160330100_15.jpg";
        vec_path.push_back(path);
    }

    size_t last_recoder = 0;
    int index = 0;
    int max_value = vec_path.size();

    // while (true)
    {
        // for (size_t i = 0; i < vec_path.size(); i++)
        {
            int first_index = rand() % max_value;
            int second_index = rand() % max_value;

            vector<string> vec_file_name;
            vec_file_name.push_back(vec_path[first_index]);
            // vec_file_name.push_back(vec_path[second_index]);

            std::vector<AnalysisResult> result = village_pic_analysis_file(vaHandle, vec_file_name);
            show_result(result, vec_path);

            size_t cur_recoder = GetDeviceMem(0);
            if (cur_recoder > last_recoder)
            {
                // LOG_INFO("memesize cur: {} last:{}  file:{}  file:{}", cur_recoder, last_recoder, vec_path[first_index], vec_path[second_index]);
                LOG_INFO("memesize cur: {} last:{} ", cur_recoder, last_recoder);
            }
            last_recoder = cur_recoder;
        }
        // LOG_INFO("第{}次完成:{}", index, vec_path.size());
        LOG_INFO("第{}次完成", index);
        index++;
    }
    

    village_pic_release(&vaHandle);

    return 0;
}

static string shot_type[] = {"head", "rear", "motor", "tricycle", "body", "body_nova", "6-行人"};
static string vehicle_type[] = {"person 人", " bike 自行车", "motor 摩托车", "tricycle 三轮车", "car 汽车", "bigbus 大巴", "lorry 货车", "tractor 拖拉机", "midibus  面包/中巴"};
static string plate_status[] = {"无车牌", " 正常车牌", " 遮挡车牌"};
static string plate_type[] = {"0-单排蓝色 ", "1-单排黄色 ", "2-单排白色 ", "3-单排黑色", " 4-双排黄色 ", "5-双排白色 ", "6-新能源黄绿色 ", "7-新能源白绿色"};
static string human_color[] = {"棕", "橙", "灰", "白", "粉", "紫", "红", "绿", "蓝", "银", "青", "黄", "黑","多色", "其他"};
static string line_cls[] = {"未知", "黄实线", " 白实线", "白虚线", "黄虚线", "车道中线"};
static string seg_cls[] = {"未知","行车道/机动车道", "非机动车道", "应急车道", "导流线", "人行横道", "禁停区域", "十字路口区域", "农村道路"};

uint8_t seg_colors[][3] = { {0, 0, 0}, {0, 255, 255}, {128, 255, 0}, {255, 128, 0}, {128, 0, 255}, {255, 0, 128}, {0, 128, 255}, {0, 255, 128}, {128, 255, 255}};

void show_result(std::vector<AnalysisResult> result, vector<string> vec_path){

    cv::Mat image = cv::imread(vec_path[0]);

    for (size_t i = 0; i < result.size(); i++)
    {
        LOG_INFO("-------------------------------------------第{}张图---------------------------------------------", i);

        std::vector<VehicleInfo> info = result[i].info;
        for (size_t j = 0; j < info.size(); j++)
        {
            auto plate_info = info[j].vehicle_plate_det_recg_res;
            std::vector<pendant_info> pendant_res = info[j].vehicle_pendant_det_res;

            cv::Rect rc;
            rc.x =  info[j].vehicle_body_detect_res.rect.left_;
            rc.y = info[j].vehicle_body_detect_res.rect.top_;
            rc.width = info[j].vehicle_body_detect_res.rect.width_;
            rc.height = info[j].vehicle_body_detect_res.rect.height_;

            const cv::Scalar color(seg_colors[j][0], seg_colors[j][1], seg_colors[j][2]);
            cv::rectangle(image, rc, color);

            auto taken_info = info[j].manned_res;
            for (size_t k= 0; k < taken_info.hs_count; k++)
            {
                cv::Rect rc;
                rc.x =  taken_info.hs_rect[k].rect.left_;
                rc.y = taken_info.hs_rect[k].rect.top_;
                rc.width = taken_info.hs_rect[k].rect.width_;
                rc.height = taken_info.hs_rect[k].rect.height_;

                const cv::Scalar color(255, 255, 255);
                cv::rectangle(image, rc, color);
            }
            

            LOG_INFO("----------------{}---------------", j);
            LOG_INFO("位置特征");
            LOG_INFO("      车辆位置:{},{},{},{}", info[j].vehicle_body_detect_res.rect.left_ ,info[j].vehicle_body_detect_res.rect.top_, info[j].vehicle_body_detect_res.rect.width_, info[j].vehicle_body_detect_res.rect.height_);
            LOG_INFO("      拍摄方向:{}", shot_type[info[j].type]);
            LOG_INFO("目标类型:{}", vehicle_type[info[j].vpt_type]);
            if (info[j].vpt_type > 0)
            {
                LOG_INFO("车辆特征");
                if (plate_info.stain_vp_result.type >= 0 && plate_info.stain_vp_result.type <= 2) {
                    LOG_INFO("      号牌状态:{}", plate_status[plate_info.stain_vp_result.type]);
                }else {
                    LOG_INFO("      号牌状态:未知");
                }
                
                LOG_INFO("      号牌位置:{},{},{},{}", plate_info.rect.left_, plate_info.rect.top_, plate_info.rect.width_, plate_info.rect.height_ );
                if (plate_info.type >= 0) {
                    LOG_INFO("      号牌种类:{}  {}", plate_type[plate_info.type], plate_info.type);
                } else {
                    LOG_INFO("      号牌种类:未知", plate_type[plate_info.type], plate_info.type);
                }
                LOG_INFO("      号牌号码:{}{}{}{}{}{}{}{}", plate_info.recg[0].character, plate_info.recg[1].character, plate_info.recg[2].character, plate_info.recg[3].character, plate_info.recg[4].character, plate_info.recg[5].character, plate_info.recg[6].character, plate_info.recg[7].character);
                LOG_INFO("      号牌可信度:{}", plate_info.detect_score);
                LOG_INFO("      每位号牌可信度:  {}:{}  {}:{}  {}:{}  {}:{}  {}:{}  {}:{}  {}:{}  {}:{}", plate_info.recg[0].character, plate_info.recg[0].maxprob, plate_info.recg[1].character, plate_info.recg[1].maxprob, plate_info.recg[2].character, plate_info.recg[2].maxprob, plate_info.recg[3].character, plate_info.recg[3].maxprob, plate_info.recg[4].character, plate_info.recg[4].maxprob, plate_info.recg[5].character, plate_info.recg[5].maxprob, plate_info.recg[6].character, plate_info.recg[6].maxprob, plate_info.recg[7].character, plate_info.recg[7].maxprob);
                LOG_INFO("      车辆类型分类:{}", vehicle_type[info[j].vpt_type]);
            } else {
                LOG_INFO("行人特征");
                LOG_INFO("      上衣颜色:{}", human_color[info[j].human_upper_color]);
                LOG_INFO("      下衣颜色:{}", human_color[info[j].human_lower_color]);
            }
            
            if (pendant_res.size() > 0)
            {
                LOG_INFO("驾乘人员特征");
                for (size_t k = 0; k < pendant_res.size(); k++)
                {
                    auto one_pendant = pendant_res[k];
                    LOG_INFO("      位置信息:{},{},{},{}", one_pendant.rect.left_, one_pendant.rect.top_, one_pendant.rect.width_, one_pendant.rect.height_ );
                    LOG_INFO("      可信度:{}", one_pendant.confidence);
                    LOG_INFO("      衣着颜色:{}", human_color[one_pendant.iColor]);
                }
            }
            
            LOG_INFO("违法行为特征");
            LOG_INFO("      不戴头盔:{} 置信度:{}", info[j].mta_res.motor_driver_helmeted.status, info[j].mta_res.motor_driver_helmeted.confidence);
            LOG_INFO("      违法载人:{}", info[j].motor_manned);
            LOG_INFO("      加装雨棚:{} {}", info[j].rainshed, info[j].rainshed_prob);
            LOG_INFO("      使用手机:{} {}", info[j].phoning, info[j].phoning_prob);
            LOG_INFO("      逆行:{}", info[j].reverse_driving);
            LOG_INFO("      货厢载人:{}", info[j].truck_manned);
            LOG_INFO("      违反禁止标线  压实线:{}  压导流线:{}", info[j].cross_line, info[j].cross_diversion_line);
        }

        LOG_INFO("标线信息");
        std::vector<LineInfo> vec_line = result[i].vec_line;
        for (size_t i = 0; i < vec_line.size(); i++)
        {
            LineInfo one_line = vec_line[i];
            LOG_INFO("      标线类型:{}", line_cls[one_line.line_type]);
            string str_line = "";
            const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);
            size_t j = 0;
            for (; j < one_line.vec_pt.size() - 1; j++)
            {
                cv::line(image, one_line.vec_pt[j], one_line.vec_pt[j+1], color, 2, 8);
                str_line += to_string(one_line.vec_pt[j].x)+","+to_string(one_line.vec_pt[j].y) + "_";
            }
            str_line += to_string(one_line.vec_pt[j].x)+","+to_string(one_line.vec_pt[j].y) + "_";
            LOG_INFO("      标线点集:{}", str_line);
        }
        
        std::vector<std::vector<cv::Point> > polys;
        std::vector<SegInfo> vec_road = result[i].vec_road;
        for (size_t i = 0; i < vec_road.size(); i++)
        {
            SegInfo one_seg = vec_road[i];
            LOG_INFO("      车道类型:{}", seg_cls[one_seg.seg_type]);
            string str_line = "";
            for (size_t j = 0; j < one_seg.vec_pt.size(); j++)
            {
                str_line += to_string(one_seg.vec_pt[j].x)+","+to_string(one_seg.vec_pt[j].y) + "_";
            }

            // polys.push_back(one_seg.vec_pt);

            const cv::Scalar color(seg_colors[i][0], seg_colors[i][1], seg_colors[i][2]);
            cv::polylines(image, one_seg.vec_pt, true, color, 3);

            // cv::fillPoly(image, one_seg.vec_pt, color);
            
            LOG_INFO("      车道点集:{}", str_line);
        }

        // const cv::Scalar color(0, 0, 255);
        // cv::fillPoly(image, polys, color);
    }

    cv::imwrite("./show_result.jpg", image);
    image.release();
}