一、拼接原理

我们在现实中要把两张图片或横或竖地排列在一起,则首先要有一个平整的桌面或者一块平整的面板,这在编程中也一样的,而这个平整的面就是图层,或者可以理解为一张更大的矩形图片,这个矩形图片大到可以放下很多张你要拼接的图片,然后,在这张矩形图片的基础上,我们再进一步把要拼接的图片贴上去,这就是实现了图片的拼接。而我们只需要加载这个最大的矩形图片,就能得到出我们想要看到的拼接效果。

二、编程环境

本篇博客中图片拼接的编程环境在上一篇博客《海思篇之基于openCV的png图片加载》中已经介绍,这里就不再重复。

png图片可以实现背景透明化,所以这里主要通过操作png图片来实现,另外,本次的图片拼接是可以实现图片在任意位置的拼接,但是没办法实现两张图片的叠加。

三、代码实现

1.加载png图片,并将其转化为BMP格式的矩阵。

typedef struct PicInfo{unsigned int u32Width;unsigned int u32Height;string filename;
}PicInfo;void load_png(Mat& rgnMat, double alpha, PicInfo *imgInfo)
{Mat img;Size imgSize;//图片大小imgSize.width = imgInfo->u32Width;imgSize.height= imgInfo->u32Height;//获取图片件格式char *ext = strrchr(imgInfo->filename.c_str(), '.');if(ext == NULL)return;//png图片if(strcmp(ext,".png") == 0){//读取图片img = imread(imgInfo->filename.c_str(),IMREAD_UNCHANGED);SV_S32 imgw = img.cols;SV_S32 imgH = img.rows;if(imgw==0 || imgH==0){WriteLog(SV_AVS_ALG_LOG,"ERR:sv_alg_new:GenerateNewVehicleRgn:SV_CarModelLoad:LoadCarModel:Image is NULL");return;}//图片缩放resize(img, img, Size(imgSize.width, imgSize.height));}Mat uimg(img.size(), CV_8UC4, Scalar(0,0,0, alpha));Point root_points[1][4];root_points[0][0] = Point(0,0);root_points[0][1] = Point(0,0);root_points[0][2] = Point(0,0);root_points[0][3] = Point(0,0);const Point* ppt[1] = {root_points[0]};int npt=4;fillPoly(uimg, ppt, &npt, 1, Scalar(0,0,0,255));BGRA* ptr = (BGRA*)img.ptr<char>(0);BGRA* ptrtemp = (BGRA*)uimg.ptr<char>(0);for(int i=0;i<imgSize.height*imgSize.width;i++){ptrtemp[i].R = ptr[i].R;ptrtemp[i].G = ptr[i].G;ptrtemp[i].B = ptr[i].B;if(ptr[i].A == 0)ptrtemp[i].A =0;}rgnMat.release();rgnMat.create(imgSize.height, imgSize.width, CV_8UC4);for(int i=0; i<rgnMat.rows; i++){uimg.row(i).colRange(0, imgSize.width).copyTo(rgnMat.row(i));}return;
}

2.创建RGN区域(也就是图层),将图片排成一列,并贴到RGN区域。

//将3张图片拼接成一排
void SplitPicToColsFor3(svBITMAP_S &bitmaps, RECT_SV rectPoint, PicInfo *picInfo, SV_U32 mode)
{SV_U32 i;SV_U32 num;Point_SV point;SV_U32 flag[3] = {0,0,0};Mat roiImg[3];        //ROIMat osdImg[3];     //图标//创建图标对象num = 3;for(i=0; i<num; i++){if( picInfo[i].filename.c_str()!=NULL && 0==access(picInfo[i].filename.c_str(), F_OK)){load_png(osdImg[i], 168, &picInfo[i]);flag[i] = 1;}elseflag[i] = 0;}//创建填充区域Size size(rectPoint.u32Width, rectPoint.u32Height);osdImage.create(size, CV_8UC4);osdImage = Scalar(0,0,0,0);//获取加载高度SV_U32 hight = picInfo[0].u32Height!=0?picInfo[0].u32Height:50*3/4;//创建ROI区域for(i=0; i<num; i++){point.x = 0;point.y = rectPoint.u32Height/6 - picInfo[i].u32Height/2 + rectPoint.u32Height/3*(2-i);if(flag[i]){if(point.x>=0 && point.y>=0 && ((point.x+osdImg[i].cols)<=osdImage.cols) && ((point.y+osdImg[i].rows)<=osdImage.rows)){roiImg[i] = osdImage( Rect( point.x, point.y, osdImg[i].cols, osdImg[i].rows ) );osdImg[i].copyTo(roiImg[i]);                                            //将图标拷贝到指定的区域}}}bitmaps.pData = osdImage.ptr<void>(0);bitmaps.u32Height=osdImage.size().height;bitmaps.u32Width =osdImage.size().width;bitmaps.enPixelFormat =SV_PIXEL_FORMAT_RGB_8888;
}

3.将图层矩阵(矩形图片)数据存储到海思可以调用的结构体成员中,用于海思HI_MPI_RGN_SetBitMap函数的调用。

void Load_Cols(svRgnBitMap** vehicleRgn, PicInfo *picInfo)
{Mat osdImage;svBITMAP_S bitmap;SV_CarModelLoad _carModel;SplitPicToColsFor3(bitmap, rectPoint, picInfo, dir);svBITMAP_S* outBitMap = new svBITMAP_S;outBitMap->u32Width = bitmap.u32Width;outBitMap->u32Height = bitmap.u32Height;SV_U32 size = bitmap.u32Width*bitmap.u32Height*4;outBitMap->pData = malloc(size);memcpy(outBitMap->pData,bitmap.pData,size);outBitMap->enPixelFormat=bitmap.enPixelFormat;svRgnBitMap* carRgn = new svRgnBitMap;carRgn->Bitmaps=outBitMap;//图片起点坐标carRgn->stx = 2*(rectPoint.s32X>>1);carRgn->sty=2*(rectPoint.s32Y>>1);*vehicleRgn = carRgn;return ;
}

4.调用加载效果。

int main(void)
{//创建海思RGN区域//配置图片参数//加载png图片,并转化为BMP格式Load_Cols(&_newVehicleRgn,  picInfo);//加载位图if(_newVehicleRgn != NULL){BITMAP_S* bitmap =(BITMAP_S*)_newVehicleRgn->Bitmaps;s32Ret = HI_MPI_RGN_SetBitMap(Handle[i],(const BITMAP_S*)bitmap);if(s32Ret<0){printf("HI_MPI_RGN_SetBitMap failed with %x\n", s32Ret);HI_MPI_RGN_Destroy(Handle[i]);return (s32Ret);}free(bitmap->pData);delete bitmap;delete _newVehicleRgn;}
}

海思篇之基于openCV的png图片拼接相关推荐

  1. 【海思篇】【Hi3516DV300】二、使用串口烧写映像

    目的:将上一章节编译出的映像文件烧写到板子上:让更多的爱好者了解海思.加入海思. 目录 1 准备工作 2 开始烧写 3 配置启动参数 4 结果 1 准备工作 1)准备海思工具HiTool.exe,启动 ...

  2. 海思篇之开机logo的加载(Hi3531a代码版)

    在看这篇博客之前,建议大家先参考前一篇博客海思篇之开机logo的加载(Hi3531a命令版),在了解了logo加载的流程之后,接下来的代码篇才会更容易理解.我用的开发板是Hi3531a,不同的版本可能 ...

  3. 【海思篇】【Hi3516DV300】六、音频输入篇

    目的:使海思板的麦克风和扬声器工作起来:让更多的爱好者了解海思.加入海思. 目录 1 准备工作 1)音频能力 2)检测板子 3)sample下audio编译 2 麦克风调试 1)配置acap音频参数 ...

  4. 海思Hi3516A上移植OpenCV

    最近新换了工作,工作中一项任务是将OpenCV移植到Hi3516A平台上.这项工作涉及到很多步骤,中间可以说经历了千难万险,克服了种种艰难困苦,最终成功了!现将过程详细写出,一方面作为此段工作的总结和 ...

  5. 海思篇之开机logo的加载(Hi3531a命令版)

    一,海思logo加载的实现流程 海思的加载主要是在uboot启动后(kernel起来之前),输入相关的命令来实现的,具体要用到什么命令,以及命令的顺序,则可以参考海思的开发文档<HiMPP 开机 ...

  6. 【海思篇】【Hi3516DV300】八、手撸一个海思SPI驱动

    目的:使用SPI接口让LCD绘制LOGO:让更多的爱好者了解海思.加入海思. 目录 1 查询SPI相关的寄存器 2 SPI的管脚复用 3 SPI的时钟开启 4 SPI1_CSN0启用和配置 5 实现读 ...

  7. 【海思篇】【Hi3516DV300】十八、TSENSOR 芯片温度检测驱动 开发

    文章目录 一 芯片操作步骤 二 驱动层实现 三 应用层实现 四 测试 一 芯片操作步骤 参考<<Hi3516DV300专业型Smart IP Camera SoC用户指南.pdf>& ...

  8. 【海思篇】【Hi3516DV300】一、 逐步搭建开发环境

    目的: 熟悉环境和流程,让更多的爱好者了解海思.加入海思. 目录 1 安装ubunu14 2 软件包安装 3 安装交叉编译工具 4 安装SDK 步骤 1.解压缩 SDK 包 步骤 2. 展开 SDK ...

  9. 【海思篇】【Hi3516DV300】十七、创建swap分区

    目的:创建swap分区 默认关闭 Swap的total是0,所以hi3516dv300默认是没有swap分区: ~ # freetotal used free shared buffers cache ...

最新文章

  1. Vue—基础概念—组建化
  2. 分页插件pageHelpler的使用(ssm框架中)服务器端分页
  3. RTMPDump源代码分析 0: 主要函数调用分析
  4. ios添加GPUImage到项目
  5. json-lib解析json之二维JSONArray
  6. 2021年BATJ30套大厂Android经典高频面试题,附答案
  7. 操作系统-高响应比优先调度算法
  8. 【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
  9. 使用 Prometheus-Operator 监控 Calico
  10. 读取工程下的文档 统计重复的姓名 并按次数排序 java_java并打印出重复的姓名和重复的次数,并按重复次数排序...
  11. 关于能连上网却打不开网页的问题
  12. 金融IT 行业常见术语
  13. 苹果x屏幕出现一条绿线_iPhone X 屏幕维修怎么防止被坑?各种屏幕的介绍
  14. 2020年数学建模国赛C题完整代码下载链接处
  15. 【STC单片机学习】第十一课:蜂鸣器
  16. fpga初始化错误_关于用FPGA对sja1000进行初始化的有关问题
  17. R语言用泊松Poisson回归、GAM样条曲线模型预测骑自行车者的数量
  18. 智能电网的电能预估及价值分析
  19. linux7 seinfo,SELinux+
  20. 打折优惠——循环入门

热门文章

  1. 我在杭州实习的这些天
  2. 【王者荣耀】皮肤-英雄 预测(tensorflow)
  3. 服务器共享文件垃圾箱,公共垃圾桶设计介绍.doc
  4. 苹果M1芯片机器学习向测评:Mini 比RTX 2080Ti 快14%,Air好于Pro
  5. 哪种编程语言最赚钱?
  6. 蓝桥杯scratch集训操作题:数的判断和计算
  7. 博客园客户端登录测试
  8. java 魔法值_可别在代码种写那么多魔法值了!
  9. JAVA毕业设计技术旅游平台计算机源码+lw文档+系统+调试部署+数据库
  10. 人物结局 归德侯府_《归德侯府》