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个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2024-07-09 13:58:30
-
2024-07-09 17:42:47
-
2024-07-08 21:24:45
-
2023-12-15 10:54:52
-
2024-12-12 20:57:55
-
2023-06-25 10:32:02
-
2024-01-03 14:11:33
-
2024-09-27 14:54:08
-
2024-07-19 11:00:09
-
2023-12-25 10:12:10
-
2023-12-15 11:27:40
-
2020-05-15 08:57:31
-
2020-05-29 16:42:23
-
2020-10-02 12:44:59
-
2019-09-20 09:53:08
-
2024-09-27 11:37:54
-
2024-03-15 15:38:18
-
2024-12-27 11:12:13
-
2025-01-07 14:21:37
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5想要咨询一下Sil9135+Sil9134形成的一个显示链路.
-
5Hi3516移植USB摄像头的SDK,如何修改Makefile?
-
5ss928从SD卡启动
-
50HI3516CV610调试raw+ahd,均使用2lane mipi
-
5HI3516DV500接收不到FPGA传过来的BT1120数据,时钟和配置都没问题VI就是检测不到数据~
-
5请教一下,Hi3516DV500 ebaina的SDK有没有实现RTSP推流?
-
5SS928的emmc有32GB,bootargs设置使用16GB,但是为啥能用的只有rootfs的大小
-
33SS928怎样烧写ubuntu系统
-
10ToolPlatform下载rootfs提示网络失败
-
10谁有GK7205V500的SDK
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认