Page 1 of 1

opencv-mobile长时间抓图会导致alloc failed, req-size: 765 pages, ret: -12

Posted: 2025-03-02 9:04
by zlzong
一、系统信息

Code: Select all

Linux luckfox 5.10.160 #2 Thu Nov 28 14:03:14 CST 2024 armv7l GNU/Linux

Code: Select all

[root@luckfox root]# cat /proc/device-tree/model
Luckfox Pico Ultra W
摄像头为sc3336

二、现象:
使用opencv-mobile抓图,一开始可以正常抓取,持续一段时间之后,抓图会报错:
opencv-mobile打印:

Code: Select all

   devpath = /dev/video11
   driver = rkisp_v7
   card = rkisp_mainpath
   bus_info = platform:rkisp-vir0
   version = 20500
   capabilities = 84201000
   device_caps = 4201000
   fmt = UYVY 4:2:2  59565955
   fmt = Y/CbCr 4:2:2  3631564e
   fmt = Y/CrCb 4:2:2  3136564e
   fmt = Y/CrCb 4:2:0  3132564e
       size = 32 x 32  ~  2304 x 1296  (+8 +8)
   fmt = Y/CbCr 4:2:0  3231564e
   fmt = Y/CrCb 4:2:0 (N-C)  31324d4e
   fmt = Y/CbCr 4:2:0 (N-C)  32314d4e
XCORE:K:rk_aiq_uapi_sysctl_preInit_scene: main_scene: normal, sub_scene: day
IPCSERVER:K:cid[0] Process path:/tmp/UNIX.domain0, sockfd:29
XCORE:K:cid[0] rk_aiq_uapi_sysctl_init success. iq:/oem/usr/share/iqfiles/sc3336_CMK-OT2119-PC1_30IRC-F16.json
XCORE:K:cid[0] rk_aiq_uapi_sysctl_prepare success. mode:0 
/dev/video11 does not support changing fps
RK_DMA_HEAP_ALLOC_BUFFER failed
dma_buf_alloc 6220800 failed
MessageParser process loop exit!
IPCSERVER:K:cid[0] Deinit success
XCORE:K:cid[0] rk_aiq_uapi_sysctl_deinit_locked success.
dmesg日志:

Code: Select all

[11678.171811] stream_cif_mipi_id0: open video, entity use_countt 2
[11678.171918] stream_cif_mipi_id1: open video, entity use_countt 1
[11678.177607] rkisp rkisp-vir0: first params buf queue
[11678.178488] cma: cma_alloc: rk-dma-heap-cma: alloc failed, req-size: 765 pages, ret: -12
[11678.178507] vb2_cma_sg_alloc_contiguous: cma_en:1 alloc pages fail
[11678.182423] stream_cif_mipi_id1: close video, entity use_count 0
[11678.182468] stream_cif_mipi_id0: close video, entity use_count 1
[11678.183064] stream_cif_mipi_id0: s_power 0, entity use_count 0
[11708.162895] stream_cif_mipi_id0: s_power 1, entity use_count 1
[11708.171802] stream_cif_mipi_id0: open video, entity use_countt 2
[11708.171909] stream_cif_mipi_id1: open video, entity use_countt 1
[11708.177917] rkisp rkisp-vir0: first params buf queue
[11708.178821] cma: cma_alloc: rk-dma-heap-cma: alloc failed, req-size: 765 pages, ret: -12
[11708.178840] vb2_cma_sg_alloc_contiguous: cma_en:1 alloc pages fail
[11708.184811] stream_cif_mipi_id1: close video, entity use_count 0
[11708.184856] stream_cif_mipi_id0: close video, entity use_count 1
[11708.185764] stream_cif_mipi_id0: s_power 0, entity use_count 0
[11711.056130] done=1 retry_required=0 sw_retry_required=0 acknowledged=1
[11738.162848] stream_cif_mipi_id0: s_power 1, entity use_count 1
[11738.175884] stream_cif_mipi_id0: open video, entity use_countt 2
[11738.181834] stream_cif_mipi_id1: open video, entity use_countt 1
[11738.188315] rkisp rkisp-vir0: first params buf queue
[11738.191568] cma: cma_alloc: rk-dma-heap-cma: alloc failed, req-size: 765 pages, ret: -12
[11738.191589] vb2_cma_sg_alloc_contiguous: cma_en:1 alloc pages fail
[11738.199858] stream_cif_mipi_id1: close video, entity use_count 0
[11738.199908] stream_cif_mipi_id0: close video, entity use_count 1
[11738.201599] stream_cif_mipi_id0: s_power 0, entity use_count 0
[11768.162904] stream_cif_mipi_id0: s_power 1, entity use_count 1
[11768.171843] stream_cif_mipi_id0: open video, entity use_countt 2
[11768.171953] stream_cif_mipi_id1: open video, entity use_countt 1
[11768.177453] rkisp rkisp-vir0: first params buf queue
[11768.178322] cma: cma_alloc: rk-dma-heap-cma: alloc failed, req-size: 765 pages, ret: -12
[11768.178342] vb2_cma_sg_alloc_contiguous: cma_en:1 alloc pages fail
[11768.182290] stream_cif_mipi_id1: close video, entity use_count 0
[11768.182341] stream_cif_mipi_id0: close video, entity use_count 1
[11768.182943] stream_cif_mipi_id0: s_power 0, entity use_count 0
[11798.162961] stream_cif_mipi_id0: s_power 1, entity use_count 1
[11798.174144] stream_cif_mipi_id0: open video, entity use_countt 2
[11798.174250] stream_cif_mipi_id1: open video, entity use_countt 1
[11798.181636] rkisp rkisp-vir0: first params buf queue
[11798.184005] cma: cma_alloc: rk-dma-heap-cma: alloc failed, req-size: 765 pages, ret: -12
[11798.184025] vb2_cma_sg_alloc_contiguous: cma_en:1 alloc pages fail
[11798.189193] stream_cif_mipi_id1: close video, entity use_count 0
[11798.189243] stream_cif_mipi_id0: close video, entity use_count 1
[11798.189838] stream_cif_mipi_id0: s_power 0, entity use_count 0
[12011.052515] done=1 retry_required=0 sw_retry_required=0 acknowledged=1
三、代码
opencv-mobile使用的是https://github.com/LuckfoxTECH/luckfox_pico_rkmpi_example,kernel-5.10.160分支

测试代码(每30s调用一次):

Code: Select all

    cv::VideoCapture cap;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
    if (!cap.open(0)) {
        LOG_ERROR("Failed to open camera");
        cap.release();
        return ProcessorStatus::kProcessorFailure;
    }

    const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    LOG_DEBUG("Camera frame size is {} x {}", w, h);
    cv::Mat frame;
    cap >> frame;

    if (frame.empty()) {
        LOG_ERROR("Failed to capture");
        cap.release();
        return ProcessorStatus::kProcessorFailure;
    }

    auto timeString = getCurrentTimeString();
    MyFontFace fontFace;
    cv::putText(frame, timeString,cv::Point(30, 60), cv::Scalar(127, 0, 127), fontFace, 20);
    cv::putText(frame, "1",cv::Point(30, 1040), cv::Scalar(127, 0, 127), fontFace, 20);
    cap.release();
    if (!cv::imwrite("/userdata/capture/out.jpg", frame)) {
        LOG_ERROR("Failed to save photo");
        return ProcessorStatus::kProcessorFailure;
    }

Re: opencv-mobile长时间抓图会导致alloc failed, req-size: 765 pages, ret: -12

Posted: 2025-03-04 11:26
by Crocodile
您好,从日志上来看应该是DMA分配问题,Opencv-mobile 内部调用了 RGA 库用于加速图像的二次处理,在RV1103/RV1106 RGA只能操作DMA buffer,所以应该是Opencv-mobile 库在进行RGA操作后没有及时释放内存导致,https://github.com/LuckfoxTECH/luckfox_ ... 较老的版本仅用于辅助 rkmpi 库运行例程,目前 opencv-mobile 仓库https://github.com/nihui/opencv-mobile有较新的版本可以尝试在新版本下抓图