如何改變偵測物件的框的顏色?

研究solution_host_stream 的程式,看來yolo偵測的結果會在print_yolo_result()裡面,會去呼叫setup_isp_privacy_mask() 來畫框。我想根據不同的classNum來畫不同顏色偵測框,就修改setup_isp_privacy_mask()這個函式,把classNum傳進去,然後在setup_isp_privacy_mask()這裡面根據不同的classNum改變不同的顏色值給tIspPmOpt.abyColorYUV[0~2]這三個變數。但是為何顏色只有在第一次呼叫setup_isp_privacy_mask會實際使用我定義的classNum的顏色,後續的classNum的改變,都不會再變顏色了,就一直以第一次的顏色為後續所有的偵測框的顏色?我有埋printf 在改變tIspPmOpt.abyColorYUV[0~2]這三個變數的地方,每次classNum的改變,這三個顏色值也會跟著變化,但是實際畫出來的顏色仍然就是以第一次出現的框的顏色為主。為什麼?例如第一次出現的classNum為2,使用紅色,後續不管傳什麼classNum進去,他就一直都是畫紅色,不會變其他色。下次重開機,我給第一次出現的classNum為3,使用綠色,後續不管傳什麼classNum進去,他就一直都是畫綠色,不會變其他色。

Comments

  • Hi 蔚禮,

    privacy_mask只能設定一種顏色且沒辦法更改,如果需要不同顏色請參考draw_rect()。

  • 在solution_host_stream裡面,draw_rect是會被kdp2_host_stream_draw_box所調用。而kdp2_host_stream_draw_box 會被kdp2_host_stream_image_thread所調用。而kdp2_host_stream_image_thread會在kp_firmware裡面的main() 啟動時就會開啟thread

       pthread_create(&task_stream_image_handle, NULL, kdp2_host_stream_image_thread, &HostStreamInit);

       pthread_create(&task_update_result_handle, NULL, kdp2_host_update_result_thread, &HostStreamInit);

    但是我不懂的是在yolo偵測過程中,似乎都不會進入到這兩個程序裡面來畫框,只有在app_header_recv_inference會呼叫到print_yolo_result 而執行setup_isp_privacy_mask畫框。要如何才會讓kdp2_host_stream_image_thread起作用來執行kdp2_host_stream_draw_box 的畫框條件呢?

  • Hi 蔚禮,

    請參考以下說明 ,需注意這種方式如果同時間畫太多框會導致效能下降,使用上需要再評估。

    開啟EIS就會使用cpu畫框 (g_dwDrawBoxType = 1;)

      //! Fill EIS configuration
      if (pHostStreamInit->dwEisEnable == 1) {
        tVsrcFrontendConfig.tFecInitConfig.ptEisInit = calloc(1, sizeof(VMF_EIS_INIT_T));
        if (!tVsrcFrontendConfig.tFecInitConfig.ptEisInit) {
          printf("[%s] calloc VMF_EIS_INIT_T fail.\n", __func__);
          pHostStreamInit->dwEisEnable = 0;
        } else {
          set_eis(tVsrcFrontendConfig.tFecInitConfig.ptEisInit);
          if ( tVsrcFrontendConfig.tFecInitConfig.ptEisInit->dwGridSection > 1 ) {
             // Using dma to draw box
            g_dwDrawBoxType = 1;
          }
        }
      }
    

    指定cpu畫框後,就會執行 pthread_create(&task_draw_box_handle, NULL, kdp2_host_stream_draw_box, pHostStreamInit);

            if (g_dwDrawBoxType && pHostStreamInit->bDrawBoxEnable && i == 0) {
              if ((pHostStreamInit->tVEncoder[i].ptHandle = init_video_encoder(pHostStreamInit->tVEncoder[i], pHostStreamInit->tVEncoder[i].ptSRB, pHostStreamInit->tVEncoder[i].dwKeepRatio, g_ptBind, 2)) == NULL) {
                printf("ERROR: init_video_encoder() fail .\n");
                goto EXIT_MIPI_IMAGE_THREAD;
              }
              pthread_create(&task_draw_box_handle, NULL, kdp2_host_stream_draw_box, pHostStreamInit);
              pthread_setname_np(task_draw_box_handle, "inf_drawbox");
            } else {
    
The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.