|
本帖最后由 小旺的尾巴 于 2021-8-10 10:09 编辑
(哪位大佬给提供一个RGA合成两张图片的demo呀, 万分感谢。)
下面是我写的一个demo, 输入两张brga的图像后,通过 imcomposite 合成出来的图像 总是第一张图,不知道什么原因,请大佬指点一下
int test_fuse(const char *img_bgr_path, const char *img_bgr2_path)
{
//1,两张图像
struct timeval start_time, stop_time;
gettimeofday(&start_time, NULL);
Mat img_bgr = cv::imread(img_bgr_path, -1);
Mat img_bgr2 = cv::imread(img_bgr2_path, -1);
if(!img_bgr.data || !img_bgr2.data)
{
printf("cv imread error.\n");
return -1;
}
//2.1,拷贝图像数据到 media buffer
unsigned int img_bgr_h = img_bgr.rows;
unsigned int img_bgr_w = img_bgr.cols;
unsigned int img_bgr_c = img_bgr.channels();
unsigned int img_bgr2_h = img_bgr2.rows;
unsigned int img_bgr2_w = img_bgr2.cols;
unsigned int img_bgr2_c = img_bgr2.channels();
printf(" --- %d, %d, %d; %d, %d, %d\n", img_bgr_h, img_bgr_w, img_bgr_c, img_bgr2_h, img_bgr2_w, img_bgr2_c);
if(img_bgr_h != img_bgr2_h || img_bgr_w != img_bgr2_w || img_bgr_c != img_bgr2_c)
{
printf("image size not equal.\n");
return -1;
}
RK_U32 u32FrameSize = img_bgr_h * img_bgr_w * img_bgr_c;
printf("img_bgr_w:%d, img_bgr_h:%d, u32FrameSize: %d\n", img_bgr_w, img_bgr_h, u32FrameSize);
MB_IMAGE_INFO_S mb_img_info = {img_bgr_w, img_bgr_h, img_bgr_w, img_bgr_h, IMAGE_TYPE_ABGR8888};
MEDIA_BUFFER img_bgr_mb = RK_MPI_MB_CreateImageBuffer(&mb_img_info, RK_TRUE, 0);
if (!img_bgr_mb)
{
printf("ERROR: rgb no space left!\n");
return -1;
}
memcpy(RK_MPI_MB_GetPtr(img_bgr_mb), (void*)img_bgr.data, u32FrameSize);
RK_MPI_MB_SetSize(img_bgr_mb, u32FrameSize);
MEDIA_BUFFER img_bgr2_mb = RK_MPI_MB_CreateImageBuffer(&mb_img_info, RK_TRUE, 0);
if (!img_bgr2_mb)
{
printf("ERROR: bgr2 no space left!\n");
return -1;
}
memcpy(RK_MPI_MB_GetPtr(img_bgr2_mb), (void*)img_bgr2.data, u32FrameSize);
RK_MPI_MB_SetSize(img_bgr2_mb, u32FrameSize);
//check
RK_U32 u32MbFrameSize = RK_MPI_MB_GetSize(img_bgr2_mb);
printf("check u32MbFrameSize:%u\n", u32MbFrameSize);
//2.2, 图像数据转为 rga buffer 格式, 进行resize
rga_buffer_t rga_buf_bgr = wrapbuffer_fd(RK_MPI_MB_GetFD(img_bgr_mb), img_bgr_w, img_bgr_h, RK_FORMAT_BGRA_8888);
rga_buffer_t rga_buf_bgr2 = wrapbuffer_fd(RK_MPI_MB_GetFD(img_bgr2_mb), img_bgr2_w, img_bgr2_h, RK_FORMAT_BGRA_8888);
MEDIA_BUFFER img_rs_mb = RK_MPI_MB_CreateImageBuffer(&mb_img_info, RK_TRUE, 0);
if (!img_rs_mb)
{
printf("ERROR: fuse no space left!\n");
return -1;
}
rga_buffer_t rga_buf_rs = wrapbuffer_fd(RK_MPI_MB_GetFD(img_rs_mb), img_bgr_w, img_bgr_h, RK_FORMAT_BGRA_8888);
//2.3 缩放bgr图
int left_top_flag = 1;
if(left_top_flag)
{
IM_STATUS STATUS = imresize(rga_buf_bgr, rga_buf_rs, 0.5, 0.5);
printf("resizing .... %s\n", imStrError(STATUS));
}
else
{
rga_buf_rs.wstride = (int)(0.5 * rga_buf_bgr.width);
rga_buf_rs.hstride = (int)(0.5 * rga_buf_bgr.height);
IM_STATUS STATUS = imresize(rga_buf_bgr, rga_buf_rs, 0.5, 0.5);
printf("resizing .... %s\n", imStrError(STATUS));
}
//2.4保存cv Mat缩放图片
Mat img_rs;
if(left_top_flag)
{
img_rs = Mat(img_bgr_h, img_bgr_w, CV_8UC4, (unsigned char *)RK_MPI_MB_GetPtr(img_rs_mb));
}
else
{
img_rs = Mat((int)(img_bgr_h/2), (int)(img_bgr_w/2), CV_8UC4, (unsigned char *)RK_MPI_MB_GetPtr(img_rs_mb));
}
cv::imwrite("img_rs_bgr0_5lt.png", img_rs);
//3.1图像融合: 缩放后的bgra与bgr2图融合
MEDIA_BUFFER img_fuse_mb = RK_MPI_MB_CreateImageBuffer(&mb_img_info, RK_TRUE, 0);
if (!img_fuse_mb)
{
printf("ERROR: fuse no space left!\n");
return -1;
}
rga_buffer_t rga_buf_fuse = wrapbuffer_fd(RK_MPI_MB_GetFD(img_fuse_mb), img_bgr_w, img_bgr_h, RK_FORMAT_BGRA_8888);
// rga_buf_bgr2.global_alpha = 0x30;
rga_buf_rs.global_alpha = 0x30;
imcomposite(rga_buf_rs, rga_buf_bgr2, rga_buf_fuse, IM_ALPHA_BLEND_DST_OVER, 1);
// imblend(rga_buf_rs, rga_buf_bgr2, IM_ALPHA_BLEND_SRC, 1);
Mat img_fuse_s = Mat(img_bgr_h, img_bgr_w, CV_8UC4, (unsigned char *)RK_MPI_MB_GetPtr(img_fuse_mb));
cv::imwrite("img_fuse_s.png", img_fuse_s);
Mat img_bgr2_s = Mat(img_bgr_h, img_bgr_w, CV_8UC4, (unsigned char *)RK_MPI_MB_GetPtr(img_bgr2_mb));
cv::imwrite("img_bgr2_s.png", img_bgr2_s);
gettimeofday(&stop_time, NULL);
printf("rga fuse use %f ms\n", (__get_us(stop_time) - __get_us(start_time)) / 1000);
//4, release资源
RK_MPI_MB_ReleaseBuffer(img_bgr_mb);
RK_MPI_MB_ReleaseBuffer(img_bgr2_mb);
RK_MPI_MB_ReleaseBuffer(img_rs_mb);
RK_MPI_MB_ReleaseBuffer(img_fuse_mb);
return 0;
}
|
|