4.记一个特别的坑。

最近在写yolo_kcf,前面的测试其实还算比较顺利,关于状态切换,今天遇到了一个坑,现在还没有解决,写出来记录一下,看是不是自己知识有盲区啊。

大概的背景:yolo的视频检测的代码主要是用c写的,kcf的代码主要是cpp写的,这里遇到的问题主要设计两个文件:

  1. demo.c
    主要是这么一个代码:
void *detect_in_thread(void *ptr)
{

    if(tracking==0)
    {
    running = 1;       //就是一个标志位,表示正在进行当前的进程吧?
    float nms = .4;     //nms是最大值检测的

    layer l = net->layers[net->n-1];
    float *X = buff_letter[(buff_index+2)%3].data;   //数据,这就是直接图像数据的指针了
    network_predict(net, X);    //网络预测

    /*
       if(l.type == DETECTION){
       get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0);
       } else */
    remember_network(net);      
    detection *dets = 0;
    int nboxes = 0;
    dets = avg_predictions(net, &nboxes);    
    //获得检测的结果



    //注释掉的这一部分应该是以前的版本
    /*
       int i,j;
       box zero = {0};
       int classes = l.classes;
       for(i = 0; i < demo_detections; ++i){
       avg[i].objectness = 0;
       avg[i].bbox = zero;
       memset(avg[i].prob, 0, classes*sizeof(float));
       for(j = 0; j < demo_frame; ++j){
       axpy_cpu(classes, 1./demo_frame, dets[j][i].prob, 1, avg[i].prob, 1);
       avg[i].objectness += dets[j][i].objectness * 1./demo_frame;
       avg[i].bbox.x += dets[j][i].bbox.x * 1./demo_frame;
       avg[i].bbox.y += dets[j][i].bbox.y * 1./demo_frame;
       avg[i].bbox.w += dets[j][i].bbox.w * 1./demo_frame;
       avg[i].bbox.h += dets[j][i].bbox.h * 1./demo_frame;
       }
    //copy_cpu(classes, dets[0][i].prob, 1, avg[i].prob, 1);
    //avg[i].objectness = dets[0][i].objectness;
    }
     */

    //非极大值抑制,
    if (nms > 0) do_nms_obj(dets, nboxes, l.classes, nms);
    
    //打印一些参数
    //帧率和识别的目标
    printf("\033[2J");
    printf("\033[1;1H");
    printf("\nFPS:%.1f\n",fps);
    printf("Objects:\n\n");
    image display = buff[(buff_index+2) % 3];    //需要显示的当前的图片

    //图上面画框之类的函数,但是这里实际实际上并没有显示,显示的话还是需要用opencv来做
    draw_detections(display, dets, nboxes, demo_thresh, demo_names, demo_alphabet, demo_classes);

    box bbox=dets[0].bbox;
    track_box.x=bbox.x*display.w;
    track_box.y=bbox.y*display.h;
    track_box.w=bbox.w*display.w;
    track_box.h=bbox.h*display.h;

    /*
    printf("from (x,y)=(%d,%d)\t",xx,yy);
    printf("(w,h)=(%d,%d)\n",ww,hh);
    printf("%d\n",nboxes);
    */
    /*这里一定要来判断bboxes是否是大于0的,如果不是的话,
    那么dets[0]和dets[0].prob[0]这两个指针都是空的,把空指针传入printf就只能等着程序崩溃了。
    陷阱就是虽然指针是野的,但是是有值的,可以进行计算,我一开始写的是:
    float prob=dets[0].prob[0]*100;
    printf("%f\n",prob);
    第一句计算是不会报错的,第二句直接崩溃。
    */
    if(nboxes>0)
    {
        printf("%f\n",dets[0].prob[0]*100);
        if(dets[0].prob[0]*100>=95)   //如果检测到的置信率大于95%的话就转入跟踪
        {
            tracking=1;        //进入跟踪状态
            track_begin=1;     //这是第一次进入跟踪状态
        }
    }
    //释放内存应该是
    free_detections(dets, nboxes);
    

    demo_index = (demo_index + 1)%demo_frame;
    running = 0;
    return 0;
    }
    //这里不用else,也就是说我是需要上面的运行结束之后,当前的帧就要转换到tracking模式下来做第一帧
    //图像的显示函数是不能自己来写的,因为这个东西全是交给线程来做的,所以这里只能修改不能做显示,要不会卡死的。
    if(tracking==1)      
    {
        //printf("this is tracking process!!!\n");
        image current_img = buff[(buff_index+2) % 3];
        //printf("track_begin%d\t\n",track_begin);    //这里看着是1啊,但是到后面就直接成了172了,神奇
        //printf("bbox:%d\t%d\t%d\t%d\n",track_box.x,track_box.y,track_box.w,track_box.h);

        kcf(current_img,track_box,track_begin,tracking); 
    }
}

没心思的看的话我简化一下:
static tracking=0;
static track_begin=0;

void *detect_in_thread(void *ptr)
{
   if(tracking=0)
  {
     if(一定条件)
     {
        tracking=1;
        track_begin=1;
      }
  }
   if(tracking=1)
  {
     kcf(一些参数,tracking,track_begin);
     //kcf是另外一个文件里的一个函数,需要track_begin来判断
  }
}
  1. image_opencv.cpp
void kcf(image img,c_rect &bbox,int isBegin,int tracking)
{
    cout<<"is Begin:\t"<<isBegin<<endl;
    cout<<"is tracking \t"<<tracking<<endl;
    if(isBegin==1)
    {
        cout<<"hello world!"<<endl;
        Mat first_frame=image_to_mat(img);     //图片转换为mat格式
        cout<<"frame_sz:\t"<<first_frame.size()<<endl;
        
        Rect first_rect=Rect(bbox.x,bbox.y,bbox.w,bbox.h);     //box格式的位置转换为rect格式的

        tracker.init(first_rect,first_frame);        //初始化跟踪器
    }
    else
    {
        
        Mat current_frame=image_to_mat(img);       //获取当前帧的视频,这里是没有问题的,图像也能获取    
        //目前的问题是调用这个更新就会报错,我也不知道是怎么回事
        //cv::Rect tracking_res=tracker.update(current_frame);     
        //cout<<tracking_res<<endl;

    }  
}

这里面主要是如果是track_begin=1的话需要进入if来初始化跟踪器,一开始老是不对我也每发现是什么理由,直到我说不会是isBegin数字不对吧,所以我在最开始输出了一下,竟然是172,为了对比我把tracking也传入进来了,是没有问题的,所以我就懵逼了!如图,我也不知道是啥原因,我再看看,找不到原因就只能想办法规避这个坑了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容