leafqycc/rknn-cpp-Multithreading

可否支持多摄像头

pandafeng1999 opened this issue · 4 comments

想采用多摄像头并行检测,但水平实在是有限

想采用多摄像头并行检测,但水平实在是有限

最简单的,为每一个摄像头创建线程,然后每一个摄像头线程内创建一个只有1线程的模型线程池就好了
参考main里面的, 将threadNum设置成1或者2。理论上来说检测资源消耗会均摊到每一个NPU核心上(include/coreNum.hpp)

rknnPool<rkYolov5s, cv::Mat, cv::Mat> testPool(model_name, threadNum);
if (testPool.init() != 0)
{
    printf("rknnPool init fail!\n");
    return -1;
}

此方法会造成资源的一些浪费,您可以调高cv::waitKey()的值,或者自行添加sleep到循环内,确保某一个摄像头帧率不会过高

想采用多摄像头并行检测,但水平实在是有限

想采用多摄像头并行检测,但水平实在是有限

或者您可以自定义输入输出如下,然后在主线程中创建一个模型线程池,每一个摄像头线程调用put方法进行输入,再参考单生产者,多消费者的模式获取对应摄像头的输出

struct {
    int uuid;
    cv::Mat image;
}

想采用多摄像头并行检测,但水平实在是有限

想采用多摄像头并行检测,但水平实在是有限

或者您可以自定义输入输出如下,然后在主线程中创建一个模型线程池,每一个摄像头线程调用put方法进行输入,再参考单生产者,多消费者的模式获取对应摄像头的输出

struct {
    int uuid;
    cv::Mat image;
}

我想问下这个问题,我按这个实现出现两个问题,一个是之前线程数可以设置得高一些,现在只能设置成1,大于1就core dumped;另一个是画面显示的框都聚集在左上方的一个矩形区域内,不正常。请问是什么原因呢?该如何解决,期待大佬解答

想采用多摄像头并行检测,但水平实在是有限

想采用多摄像头并行检测,但水平实在是有限

或者您可以自定义输入输出如下,然后在主线程中创建一个模型线程池,每一个摄像头线程调用put方法进行输入,再参考单生产者,多消费者的模式获取对应摄像头的输出

struct {
    int uuid;
    cv::Mat image;
}

我想问下这个问题,我按这个实现出现两个问题,一个是之前线程数可以设置得高一些,现在只能设置成1,大于1就core dumped;另一个是画面显示的框都聚集在左上方的一个矩形区域内,不正常。请问是什么原因呢?该如何解决,期待大佬解答

不太清楚诶,实在不行您要不参考 rknnPool 类,直接获取线程池返回的 future 句柄,在摄像头线程内部对输入输出序列进行单独维护吧。想了想 rknnPool 类内部对线程池和 std::queue<std::future> futs 队列进行维护有点过于耦合了()