OpenCV与AIPCV库——学习笔记(一)
本专题是学习Algorithms for Image Processing and Computer Vision的笔记。
AIPCV是书名的缩写。
使用OpenCV时,需要了解的关键细节是数据结构的如何实现。因此,吧OpenCV和AIPCV连接起来的主要工作在于提供一种两个系统之间转换图像数据结构的方法。对于灰阶单通道的图像来说,这一点很简单,对于彩色图像来说,则更复杂。
AIPCV库中的基本图像数据结构由两个数据结构组成
一个是表头信息,另一个表示图像。
图像命名为image,由两个指针组成,一个纸箱头信息,一个纸箱存储的数据。
图像的结构体表示法如下:
struct image
{
struct header *info; // Pointer to header
unsigned char **data; // Pointer tp pixels
};
头信息表示如下:
struct header
{
int nr, nc;
int oi, oj;
};
其中nr表示图像的行数,nc表示图像的列数,分别等同于IplImage->height和IplImage->width
oi和oj指定了图像的原点,只有在极少数情况下使用,比如还原,在OpenCV中没有对应的字段。
怎样实现AIPCV和OpenCV之间转换呢?
OpenCV转换成AIPCV
IMAGE fromOpenCV (IplImage *x)
{IMAGE img; //定义AIPCV类型图像int color=0, i=0;int k=0, j=0;CvScalar s;if ((x->depth==IPL_DEPTH_8U) &&(x->nChannels==1)) // Grey imageimg = newimage (x->height, x->width); //新建一幅图像else if ((x->depth==8) && (x->nChannels==3)) //Color{color = 1;img = newimage (x->height, x->width);}else return 0;for (i=0; i<x->height; i++){for (j=0; j<x->width; j++){s = cvGet2D (x, i, j);if (color)k= (unsigned char) ((s.val[0]+s.val[1]+s.val[2])/3);else k = (unsigned char)(s.val[0]);img->data[i][j] = k;}}return img;
}
其中newimage表示新建一幅图像。具体如下:
struct image *newimage (int nr, int nc)
{struct image *x; /* New image */int i;unsigned char *p;if (nr < 0 || nc < 0) {printf ("Error: Bad image size (%d,%d)\n", nr, nc);return 0;}/* Allocate the image structure */x = (struct image *) malloc( sizeof (struct image) );if (!x) {printf ("Out of storage in NEWIMAGE.\n");return 0;}/* Allocate and initialize the header */x->info = (struct header *)malloc( sizeof(struct header) );if (!(x->info)) {printf ("Out of storage in NEWIMAGE.\n");return 0;}x->info->nr = nr; x->info->nc = nc;x->info->oi = x->info->oj = 0;/* Allocate the pixel array */x->data = (unsigned char **)malloc(sizeof(unsigned char *)*nr); /* Pointers to rows */if (!(x->data)) {printf ("Out of storage in NEWIMAGE.\n");return 0;}x->data[0] = (unsigned char *)malloc (nr*nc);p = x->data[0];if (x->data[0]==0){printf ("Out of storage. Newimage \n");exit(1);}for (i=1; i<nr; i++) {x->data[i] = (p+i*nc);}return x;
}
AIPCV转换成OpenCV
IplImage *toOpenCV (IMAGE x)
{
IplImage *img;
int i=0, j=0;
CvScalar s;
img=cvCreateImage(cvSize(x->info->nc,x->info->nr),8, 1);
for (i=0; i<x->info->nr; i++)
{
for (j=0; j<x->info->nc; j++)
{
s.val[0] = x->data[i][j];
cvSet2D (img, i,j,s);
}
}
return img;
}
很好理解。
OpenCV与AIPCV库——学习笔记(一)相关推荐
- opencv 纸箱分割_OpenCV与AIPCV库——学习笔记(一)
本专题是学习Algorithms for Image Processing and Computer Vision的笔记. AIPCV是书名的缩写. 使用OpenCV时,需要了解的关键细节是数据结构的 ...
- python xlwings 切片_Python xlwings库学习笔记(1)
Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...
- python标准库学习笔记
原创:python标准库学习笔记 数据结构 bisect 模块里实现了一个向列表插入元素时也会顺便排序的算法. struct - 二进制数据结构:用途:在 Python 基本数据类型和二进制数据之间进 ...
- 深度学习常用python库学习笔记
深度学习常用python库学习笔记 常用的4个库 一.Numpy库 1.数组的创建 (1)np.array() (2)np.zeros() (3)np.ones() (4)np.empty() (5) ...
- Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)
前言 本部分是Transformer库的基础部分的上半部分,主要包括任务汇总.模型汇总和数据预处理三方面内容,由于许多模型我也不太了解,所以多为机器翻译得到,错误再所难免,内容仅供参考. Huggin ...
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32 HAL库学习笔记4-SPI
STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...
- Python_pygame库学习笔记(1):pygame的由来,特点以及模块简介
Python_pygame库学习笔记 1 Pygame库的由来: Python适合用来开发游戏吗? Pygame的安装 Pygame模块简介 Pygame库的由来: 2000年,作者Pete Shin ...
- 7月16日数据科学库学习笔记——matplotlib 绘制散点图、条形图、直方图
文章目录 前言 一.绘制散点图 二.绘制条形图 1.纵向条形图 2.横向条形图 三.绘制分组条形图 四.绘制直方图 1.plt.hist 方法 2.plt.bar 方法绘制直方图 前言 本文为7月16 ...
最新文章
- 编程乐趣:C#彻底删除文件
- Objective-C代码的文件扩展名
- python主要用于后端开发还是前端,Django是用于前端还是后端?
- 测试使用skywalking_skywalking初体验
- mysql删除bin-log_删除MYSQl BIN-LOG 日志
- Html IECheckBox双击问题
- springboot @datetimeformat 标注在参数上无效_Spring Boot 中必须掌握的 45 个注解
- Python查找两个word中的相同内容
- python dlib gpu ubuntu conda_Ubuntu 下编译支持 GPU 的 TensorFlow 和 Dlib
- 利用skipList(跳表)来实现排序(待补充)
- Qt容器类之三:通用算法
- 关于js执行机制的理解
- 基于深度学习的单目人体姿态估计方法综述(一)
- 5个免费邮箱,10分钟临时邮箱,一定能用,持续更新
- 使用Notepad格式化xml
- 脿什么意思_襆怎么读_襆组词和拼音
- 搜狐畅游2021届校园招聘简章
- activiti历史数据查询
- c语言函数名大全dfun,C语言函数题库以及答案.docx
- 【历史上的今天】3 月 8 日:游戏机之父诞辰;搜索技术理论之父出生;MIT 公开演示旋风计算机
热门文章
- CRLF line terminators导致shell脚本报错:command not found --转载
- eclipse中配置文件设置字符集
- 从maya中 导入物体 到Uniyt3D 规范 整理
- 【二叉树的迭代版后序遍历】LeetCode 145. Binary Tree Postorder Traversal
- 【重点】LeetCode 143. Reorder List
- JS Navigator
- 渗透测试学习 十六、 常见编辑器漏洞解析
- BZOJ3309 DZY Loves Math(莫比乌斯反演+线性筛)
- Spring 创建代理类流程跟踪
- WPF DataGrid 获取选中的当前行某列值