项目需要,要将cmos相机的数据读出来,并显示出图片来。同事已经通过FPGA+USB的方式,把相机并行数据转成串行,我需要做的就是上位机,找到frame valid和line valid有位,读取一个frame的数据后,显示出来。

设计思路: 三个thread,第一个从usb读数据,第二个处理usb数据包,找frame valid 和 line valid, 第三个负责显示;显示部分通过定义IplImage指针,分配空间,然后通过给imdata赋值,来实现显示。

因为相机是黑白相机,处理难度不大。之前的每个pixel都是8个bits,所以opencv显示起来很容易。但是后来,上级要求每个pixel要有10个bits来表示,本以为很容易实现,后来搞了2天才搞定,决定总结一下经验,供需要的朋友参考一下。

1. opencv 图像深度

图像深度是指存储每个像素所用的位数,也用于量度图像的色彩分辨率.图像深度确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数.它决定了彩色图像中可出现的最多颜色数,或灰度图像中的最大灰度等级.比如一幅单色图像,若每个象素有8位,则最大灰度数目为2的8次方,即256.一幅彩色图像RGB3个分量的象素位数分别为4,4,2,则最大颜色数目为2的4+4+2次方,即1024,就是说像素的深度为10位,每个像素可以是1024种颜色中的一种.

opencv 深度显示范围:(也就是说当定义了如下不同深度的时候,像素的灰度值要处于显示范围之中才可以显示出来。否则要进行转换)

测试double型:0.0--1.0之间                              IPL_DEPTH_64F

测试float型:0.0--1.0之间                                  IPL_DEPTH_32F

测试long型:0--65535之间                                IPL_DEPTH_32S

测试short int型:-32768--32767之间                 IPL_DEPTH_16S

测试unsigned short int型:0--65535之间           IPL_DEPTH_16U

测试char型:-128--127之间                               IPL_DEPTH_8S

测试unsigned char型:0--255之间                     IPL_DEPTH_8U

参考链接:

http://blog.csdn.net/wode0239/article/details/8294906

2. 图像深度转换

当定义了如下的深度为16的IplImage

IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_16U,img->nChannels);

对其进行赋值,先把imdata强制转换成unsigned short型

<span style="font-size:18px;">unsigned short*  data = (unsigned short *)(pImg->imageData)for ( i=0;i<HEIGH;i++)for( j=0;j<WIDTH;j++){data[j+i*(WIDTH)] = array[j+i*(WIDTH)];}</span>

处理完后要对其进行显示。直接使用cvShowImage显示是有问题的。要进行深度转换

cvMinMaxLoc(dst , &m, &M, NULL, NULL, NULL);   // 找出dst中,所有数据的最大值和最小值
cvScale(dst , dst , 65535/(M-m), 65535*(-(m+1))/(M-m));   //把dst中的数据映射到0-65535的范围中
cvShowImage( "source image", pImg );    //完成了上述深度转换,接下来才能用cvshowImage来显示

参考链接:

http://blog.csdn.net/xiaowei_cqu/article/details/7557063

http://blog.csdn.net/loop_k/article/details/5401342

http://blog.163.com/gz_ricky/blog/static/18204911820115203045235/

http://blog.csdn.net/z397164725/article/details/7245328

3. 图像保存

最后就是要保存图片了,但是对于深度位16的图片,用cvSaveImage是不能够保存的,因为cvSaveImage只能保存深度为8的图片。这里,用imwrite来保存,无压缩,png格式。

<span style="font-size:18px;">    vector<int> compression_params;compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);compression_params.push_back(0);    // 无压缩png.sprintf(fileName, "Picture %d.png", ++countCamera); //生成文件名cv::Mat pImgMat(pImg,0);  //把IplImage转换为Matimwrite(fileName,pImgMat,compression_params);  //保存图片</span>

参考链接:

http://blog.csdn.net/fm0517/article/details/7479090

http://www.cnblogs.com/tornadomeet/archive/2012/12/26/2834336.html

Opencv 16位深度图片显示并保存相关推荐

  1. opencv 保存读取16位深度的图像

    1.项目中遇到需要保存16位深度的png图像,用来加速算法减少耗时并且数据从文本文档转换为png占用更小的flash,一举多得:     IplImage *caimage = cvCreateIma ...

  2. 8位深, 16位深,24位深,32位深图片显示原理及对比

    我们都知道一张图片可以保存为很多种不同的格式,比如bmp/png/jpeg/gif等等.这个是从文件格式的角度看,我们抛开文件格式,看图片本身,我们可以分为8位, 16位, 24位, 32位等. 单击 ...

  3. matlab怎么输出图像文件夹,Matlab读取图片 显示和保存图像的相关操作

    当前有部份朋友还不清楚Matlab读取图片 显示和保存图像的操作,所以下面绿软吧就带来Matlab读取图片 显示和保存图像的相关操作,一起来看看吧! Matlab读取图片 显示和保存图像的相关操作 打 ...

  4. opencv之中英文路径图片读取与保存

    opencv之中英文路径图片读取与保存 关于如何用opecncv读取和写入图片网上已经有很多教程,这里只是记录一下,用的时候方便查找. 1.opencv读写英文路径图片 使用函数imread()和im ...

  5. C++ openCV 图像的读取、显示、保存、加权融合、改变对比度、修改色域

    文章目录 图像的读取.显示.保存 图像的读取 图像的显示 图像的保存 图像的属性修改 图像的色域修改 图像的对比度.数据类型修改 两张图像的加权融合 图像的读取.显示.保存 使用的命名空间 #prag ...

  6. tif格式real类型图片与16位PNG图片的转化(编码/解码)

    将real类型图片编码成PNG的图片: 其原理在于以一定的编码方式,将real类型的实际高度信息转为16位的PNG图,同时,在最后一行将图片的编码方式存储下来,解码时先将编码方式读取,再将PNG格式深 ...

  7. OpenCV 读取一张图片并显示和保存

    在使用OpenCV前需要先安装numpy, matplotlib, opencv-python, opencv-contrib-python等 pip install numpy pip instal ...

  8. OpenCV基础操作_图片读取和保存

    目录 1 图片读取 2 图片保存 1 图片读取 在OpenCV中,加载图片采用imread()函数. 函数详细说明在:Reading and Writing Images and Video - Op ...

  9. opencv读取16位色深图片

    最近希望使用opencv处理从realsense获取的深度图像,但是realsense的深度图是单通道16位的,而opencv的显示函数默认接收的数据类型都是uint8,实际使用存在一些问题 open ...

  10. 8位, 16位,24位,32位图片显示原理及对比

    我们都知道一张图片可以保存为很多种不同的格式,比如bmp/png/jpeg/gif等等.这个是从文件格式的角度看,我们抛开文件格式,看图片本身,我们可以分为8位, 16位, 24位, 32位等. 单击 ...

最新文章

  1. vue-route动态路由
  2. [密码学] 杂凑函数
  3. JavaScript实现knuth-morris-pratt(KMP)算法(附完整源码)
  4. 维护没有源代码的遗留 Java 项目
  5. delphi使用存储过程
  6. ORB-SLAM2中四叉树管理特征点
  7. 吐血整理!内部包含3980大数据、机器学习、推荐系统实战课程,仅分享一次
  8. linux文件系统基础知识
  9. 【笔试/面试】SQL 经典面试题
  10. 打包的时候不把配置文件加进去_苹果软件打包签名原理
  11. Aop 是面向切面编程,
  12. paip.python错误解决14
  13. mo汇编指令_汇编指令(汇编指令详解)
  14. JAVAEE工程师-2年经验-个人简历
  15. Go语言 常用日志记录方法
  16. fastdb相关备忘
  17. 目标检测/图像分割 评价标准IOU/准确率及精确率
  18. 怎么将图片压缩到最小,用什么方法
  19. 目标检测(四):SSD之Pytorch源码解读
  20. 判断门禁卡是否加密_离无卡生活更进一步!判断您的门禁卡能否被手机NFC功能模拟...

热门文章

  1. 必知必会--HashMap容量细节
  2. centos mysql5.6卸载_centos 卸载mysql
  3. 企业与个人必备安全测试工具
  4. Codeforces Global Round 12 B. Balls of Steel 曼哈顿距离
  5. mysql建表测试_测试必备mysql技能2:mysql建表
  6. 肥猫学习日记------查找与排序(一)
  7. qt水波进度控件设计
  8. FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议
  9. Lvm linux磁盘分区管理(多个分区合并成一个)
  10. Ozone Block Chunk文件的layout方式