(1):float acos(float x) 参数x的范围为-1.0f到1.0f之间,返回值范围在0.0f到3.141592653f之间,值得注意的是:当x超出[-1.0f,1.0f]这个范围时此函数将返回一个-1.#IND000值,代表无穷小而编译器会不给出任何提示,通常此将会导致程序错误或崩溃,所以以后要注意数学函数的参数范围了.

可以通过以下代码进行调试:

float test = acos(1.0001f)
 if (test != test) {
      cout << "错误出现" << endl;
 }

昨天遇到的-1.#IND000,无穷小。但是我想用if(a==-1.#IND000)去判断,编译不过,呵呵。

现在找到方法了  ,不过方法有点怪,astone指出,b!=b应该是恒为false,但在这个情况下竟然是true

float a=10;
 float b=a/0;
 if( b > 0.0f ||b != b)
  printf("%f",b);

这个可以判断1.#INF000

float a=-10;
 float b=a/0;
 if( b < 0.0f ||b != b)
  printf("%f",b);

这个可以判断-1.#IND000

加b!=b只用于.net 2003,在vC++6.0下不用。

使用类似于pow,exp等等函数时常会产生一个无效数字1.#IND00,在VC下可以通过与一个确定数字比较大小来判断是否产生了无效数字,但这个方法在DEV-CPP下却是行不通的。

其实解决办法很简单,使用  float.h中一个函数_isnan即可:

int _isnan(double x);  
  
当x是一个无效值(NaN, Not a Number) 时,返回非零值;否则返回0.

一般可能是除数为零,使用数组时也经常出现这种情况

转自:http://blog.sina.com.cn/s/blog_3e6817300100a74d.html

(2):图像类型转换:http://blog.csdn.net/wuxiaoyao12/article/details/7305848

一、Mat类型:矩阵类型,Matrix。

在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

Mat有3个重要的方法:

1、Mat mat = imread(const String* filename);            读取图像

2、imshow(const string frameName, InputArray mat);      显示图像

3、imwrite (const string& filename, InputArray img);    储存图像

Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。

A.Mat -> IplImage

同样只是创建图像头,而没有复制数据。

例: // 假设Mat类型的imgMat图像数据存在

IplImage pImg= IplImage(imgMat);

B.Mat -> CvMat

与IplImage的转换类似,不复制数据,只创建矩阵头。

例: // 假设Mat类型的imgMat图像数据存在

CvMat cvMat = imgMat;

二、CvMat类型与IplImage类型:“图像”类型

在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

补充:IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplImage

CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理。

1.CvMat

A.CvMat-> IplImage

IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
cvGetImage(matI,img);

cvSaveImage("rice1.bmp",img);

B.CvMat->Mat

与IplImage的转换类似,可以选择是否复制数据。

Mat::Mat(const CvMat* m, bool copyData=false);

在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。

但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:

CvMat* cvCreatMat(int rows ,int cols , int type);

这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。

2.IplImage

在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。

IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。

IplImage的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。

dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。

IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。

A.IplImage -> Mat

IplImage* pImg = cvLoadImage("lena.jpg");
Mat img(pImg,0); // 0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有
B.IplImage -> CvMat

法1:CvMat mathdr, *mat = cvGetMat( img, &mathdr );

法2:CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
  cvConvert( img, mat );

C.IplImage*-> BYTE*

BYTE* data= img->imageData;

CvMat和IplImage创建时的一个小区别:

1、建立矩阵时,第一个参数为行数,第二个参数为列数。

CvMat* cvCreateMat( int rows, int cols, int type );

2、建立图像时,CvSize第一个参数为宽度,即列数;第二个参数为高度,即行数。这 个和CvMat矩阵正好相反。

IplImage* cvCreateImage(CvSize size, int depth, int channels );

CvSize cvSize( int width, int height );

IplImage内部buffer每行是按4字节对齐的,CvMat没有这个限制

补充:

A.BYTE*-> IplImage*

img= cvCreateImageHeader(cvSize(width,height),depth,channels);

cvSetData(img,data,step);

//首先由cvCreateImageHeader()创建IplImage图像头,制定图像的尺寸,深度和通道数;

//然后由cvSetData()根据BYTE*图像数据指针设置IplImage图像头的数据数据,

//其中step指定该IplImage图像每行占的字节数,对于1通道的IPL_DEPTH_8U图像,step可以等于width。

-1.#IND000 图像类型转换相关推荐

  1. 机器人视觉——图像加法、图像融合、图像类型转换

    加法运算 图像融合 图像类型转换  -- 将图像由一种类型转换为另外一种类型

  2. [Python图像处理] 五.图像融合、加法运算及图像类型转换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. java实现缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等

    可实现以下常用功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 代码如下 复制代码 import java.awt.AlphaComposite; import java.aw ...

  4. 缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印

    缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 import java.awt.AlphaComposite; import java.awt.Color; import java ...

  5. 图像数据格式uint8与double以及图像类型转换

    1. 图像数据格式 double(64位):matlab中数值一般采用double型存储和运算. uint8(8位无符号整数):为了节省存储空间,matlab为图像提供的特殊数据类型.imread把灰 ...

  6. 【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

    [MATLAB Image Processing Toolbox 入门教程六] 1 gray2ind函数 2 ind2gray函数 3 mat2gray函数 4 rgb2gray函数 5 rgb2in ...

  7. 【转载】VC++中的图像类型转换--使用开源CxImage类库

    一.CxImage类库简介 这只是翻译了CxImage开源项目主页上的部分简介及简单使用. CxImage类库是一个优秀的图像操作类库.它可以快捷地存取.显示.转换各种图像.有的读者可能说,有那么多优 ...

  8. 数字图像处理(8): 图像加法与融合运算 和 图像类型转换

    目录 1 图像加法运算 1.1 Numpy库加法运算 1.2 OpenCV加法运算- add() 1.3 对比实验 2 图像融合- addWeighted() 3 图像类型转换- cvtColor() ...

  9. matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明

    1. matlab图像保存说明 matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点doubl ...

最新文章

  1. linux设备驱动第一篇:设备驱动程序简介
  2. DL:The development history of the important stage of DL
  3. Excel表格复制到word中
  4. protobuf使用说明
  5. 数字型变量可以直接计算
  6. 用React开发SAP Fiori应用
  7. ABAP web service schema node的处理
  8. Linux中磁盘分区的管理
  9. centos 6.5装mysql 5.7,centos 6.5装mysql5.7
  10. Eclipse启动SpringCloud微服务集群的方法
  11. [SHOI2008]小约翰的游戏John
  12. 蜕变成蝶~Linux设备驱动中的并发控制
  13. SpringMVC 注解 @Scope、@PostConstruct、@PreDestroy、@ComponentScan
  14. Java 记录(4) java 生成 UUID ,java.util.UUID 使用
  15. abab的四字成语_abab式的四字词语
  16. 前端使用vue+ js-xlsl + elemen-ui实现导出Excel表格(绝对好使, 前端有问题直接关注我, 或者评论立刻给你回应, 专业解决)
  17. day03数据包拓展——抓包封包
  18. 全智通A+常见问题汇总解答—A+库存盘点,点击生成盘点,生成错误的数据
  19. golang:kratos生成proto以及API编写
  20. 椭圆机会不会练出肌肉腿

热门文章

  1. 深度学习工作机制通俗介绍
  2. CSharpGL(29)初步封装Texture和Framebuffer
  3. HDU 3549 Flow Problem
  4. 2012年度IT博客大赛50强报道:马博峰
  5. 专家称中国***袭美是炒作
  6. 通过 WIFI 用 adb 调试 Android 设备
  7. PHP修改PHP.ini上传大文件的解决办法
  8. echo count(“abc”); 输出什么?
  9. ubuntu安装远程桌面连接工具
  10. [openstack]依赖提交