斯瓦迪亚骑士

斯瓦迪亚骑士

0个粉丝

2

问答

0

专栏

0

资料

斯瓦迪亚骑士  发布于  2025-01-13 21:13:57
采纳率 0%
2个问答
57

Hi3519DV500,摄像头OS08A20,获取图像为竖条纹,请问如何排查问题

摄像头获取到的图像:

现象:
当摄像头前的物品移动后,获取到的图像是会改变的,比如绿条纹中间多了紫条纹这种

问题:
由于我没有显示屏,所以我无法通过直接运行sample_vio来排除硬件问题,请各位大佬指点一下可以从哪些方向以及如何排查问题,或者指出一下我有什么应该修改的东西没有修改,谢谢

代码思路:
在sample_vio的基础上修改,从vpss获取图像,再将图像从yuv420转为rgb并存储为jpg图片

其他修改:
我没有采用样例给的makefile而是自己写了新的,我在CMakeLists.txt中定义了DSENSOR0~3_TYPE
add_definitions(-DSENSOR0_TYPE=OV_OS08A20_MIPI_8M_30FPS_12BIT)
add_definitions(-DSENSOR1_TYPE=OV_OS08A20_MIPI_8M_30FPS_12BIT)
add_definitions(-DSENSOR2_TYPE=OV_OS08A20_MIPI_8M_30FPS_12BIT)
add_definitions(-DSENSOR3_TYPE=OV_OS08A20_MIPI_8M_30FPS_12BIT)

然后在加载ko时,参数设置为:
./load3519dv500 -i -sensor0 os08a20 -sensor1 os08a20 -sensor2 os08a20 -sensor3 os08a20

代码:
以下是修改的sample_vio

static td_s32 sample_vio_start_route(sample_vi_cfg *vi_cfg, sample_vpss_cfg *vpss_cfg, td_s32 route_num)
{
    td_s32 i, j, ret;
    ot_vpss_grp vpss_grp[SAMPLE_VIO_MAX_ROUTE_NUM] = {0, 1, 2, 3};

    //shianran-add var(get frame)-begin
    ot_video_frame_info frame_info = {0}; //图像信息
    td_s32 milli_sec = 100; //超时时间


    ot_vpss_chn_attr chn_attr = {0};

    cv::Mat frame_rgb;


    //shianran-add var(get frame)-end

    sample_comm_vi_get_size_by_sns_type(SENSOR0_TYPE, &g_vb_param.vb_size);

    //shianran-debug
    std::cout << "start vio sys init\n";

    if (sample_vio_sys_init() != TD_SUCCESS) {
        return TD_FAILURE;
    }

    for (i = 0; i < route_num; i++) {
        ret = sample_comm_vi_start_vi(&vi_cfg[i]);
            if (ret != TD_SUCCESS) {
            goto start_vi_failed;
        }
    }

    for (i = 0; i < route_num; i++) {
        sample_comm_vi_bind_vpss(i, 0, vpss_grp[i], 0);
    }

    for (i = 0; i < route_num; i++) {
        ret = sample_vio_start_vpss(vpss_grp[i], vpss_cfg);
        if (ret != TD_SUCCESS) {
            goto start_vpss_failed;
        }
    }


    //shianran-debug
    std::cout << "DEBUG:start get frame from vpss\n";


    ret = ss_mpi_vpss_get_chn_attr(0, 0, &chn_attr);
    std::cout << "DEBUG:AAA\n";
    printf("DEBUG:ss_mpi_vpss_set_chn_attr: depth = %d\n", chn_attr.depth);
    printf("DEBUG:ss_mpi_vpss_set_chn_attr: mode = %d\n", chn_attr.chn_mode);


    //从vpss获取图像并处理


    for(int i = 1; i <= 1; i++)
    {
        ret = ss_mpi_vpss_get_chn_frame(0, 0, &frame_info, milli_sec);
        if(ret != 0){
            std::cout << "ss_mpi_vpss_get_chn_frame fail\n";
            printf("ret:%x\n", ret);
            continue;
        }


        std::cout << "get frame\n";

        // ****此处进行转换***********************
        frame_rgb = ive_yuv2rgb(&frame_info);

        bool result = cv::imwrite("output_image.jpg", frame_rgb);
        if (result) {
            std::cout << "Image saved successfully as output_image.jpg" << std::endl;
        } else {
            std::cerr << "Error saving image" << std::endl;
        }

        ret = ss_mpi_vpss_release_chn_frame(0, 0, &frame_info);
        if(ret != 0){
            std::cout << "ss_mpi_vpss_release_chn_frame fail\n";
            continue;
        }
        std::cout << "release frame\n";
    }


    return TD_SUCCESS;

以下是格式转换的代码,来源https://blog.csdn.net/qq_34912332/article/details/140666156

    /**
 * @brief 将 YUV 格式的视频帧转换为 RGB 格式的 OpenCV 矩阵
 * 
 * @param frame 指向视频帧信息的指针
 * @return cv::Mat 转换后的 RGB 格式的 OpenCV 矩阵
 */
cv::Mat ive_yuv2rgb(ot_video_frame_info* frame)
{
    // 初始化输入图像的参数
    ot_svp_src_img srcImage;
    memset(&srcImage, 0, sizeof(ot_svp_src_img)); // 初始化内存为 0
    srcImage.width = frame->video_frame.width; // 设置输入图像的宽度
    srcImage.height = frame->video_frame.height; // 设置输入图像的高度
    srcImage.type = OT_SVP_IMG_TYPE_YUV420SP; // 设置输入图像的类型为 YUV420SP
    srcImage.phys_addr[0] = frame->video_frame.phys_addr[0]; // 设置输入图像的物理地址
    srcImage.phys_addr[1] = frame->video_frame.phys_addr[1]; 
    srcImage.stride[0] = frame->video_frame.stride[0]; // 设置输入图像的步长
    srcImage.stride[1] = frame->video_frame.stride[1]; 

    // 初始化输出图像的参数
    ot_svp_src_img dstImage;
    memset(&dstImage, 0, sizeof(ot_svp_src_img)); 
    td_u32 ret_create = sample_common_ive_create_image(&dstImage, OT_SVP_IMG_TYPE_U8C3_PACKAGE, td_u32(frame->video_frame.width), td_u32(frame->video_frame.height));
    if (ret_create!= 0)
    {
        printf("sample_common_ive_create_image failed with error code: %x\n", ret_create);
    }

    // 初始化颜色空间转换控制参数
    ot_ive_csc_ctrl cscCtrl;
    memset(&cscCtrl, 0, sizeof(ot_ive_csc_ctrl));
    cscCtrl.mode = OT_IVE_CSC_MODE_PIC_BT601_YUV_TO_RGB; // 设置颜色空间转换模式

    // 创建 IVE 任务句柄
    ot_ive_handle iveHandle;
    int ret = ss_mpi_ive_csc(&iveHandle, &srcImage, &dstImage, &cscCtrl, TD_TRUE);
    if (ret!= 0)
    {
        printf("ss_mpi_ive_csc failed with error code: %x\n", ret); // 如果转换失败,打印错误代码
    }

    td_u8* ptr_tmp = sample_svp_convert_addr_to_ptr(td_u8, dstImage.virt_addr[0]);
    cv::Mat* mat = new cv::Mat(frame->video_frame.height, frame->video_frame.width, CV_8UC3);
    auto mat_data = mat->data;
    for (size_t i = 0; i < frame->video_frame.height; i++)
    {
    memcpy(mat_data, ptr_tmp, frame->video_frame.width * 3);
    mat_data += frame->video_frame.width * 3;
    ptr_tmp += dstImage.stride[0] * 3;
    }
    ss_mpi_sys_mmz_free(dstImage.phys_addr[0], dstImage.virt_addr);
    return *mat;
}
我来回答
回答2个
时间排序
认可量排序

wj

6个粉丝

0

问答

0

专栏

2

资料

wj 2025-01-14 09:06:31
认可0

./PQTools.sh -a os08a20 0直接这么跑看rtsp流

MA_NONG

8个粉丝

10

问答

2

专栏

0

资料

MA_NONG 2025-01-14 14:52:54
认可0

mipi 和 vi ,cat 一下信息

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区