OpenCV_加载一张图片
来源:互联网 发布:php获取连接端口号 编辑:程序博客网 时间:2024/05/14 13:21
很久没有更新博客了。
今天更新一个小Demo,使用opencv,从本地读取一张图片。【先代码->演示结果->分析代码】
OpenCV 版本: opencv-3.1.0
关于环境的配置略过,大家可以搜索一下其他的教程说明。
代码:
#include "highgui.h"int main(int argc, char* argv[]){ IplImage* src = cvLoadImage("01.jpg",1);//加载一张图片 cvNamedWindow("title",1);//创建一个窗体 cvShowImage("title", src);//在上面的窗体中显示图片 cvWaitKey(0);//等待用户按键 cvReleaseImage(&src);//释放图片资源 cvDestroyWindow("title");//释放窗体资源 return 0;}
请准备一张01.jpg图片放在该cpp文件目录下。
运行图:
其中IplImage结构如下:
typedef struct _IplImage{ int nSize; /**< sizeof(IplImage) */ int ID; /**< version (=0)*/ int nChannels; /**< Most of OpenCV functions support 1,2,3 or 4 channels */ int alphaChannel; /**< Ignored by OpenCV */ int depth; /**< Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */ char colorModel[4]; /**< Ignored by OpenCV */ char channelSeq[4]; /**< ditto */ int dataOrder; /**< 0 - interleaved color channels, 1 - separate color channels. cvCreateImage can only create interleaved images */ int origin; /**< 0 - top-left origin, 1 - bottom-left origin (Windows bitmaps style). */ int align; /**< Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep instead. */ int width; /**< Image width in pixels. */ int height; /**< Image height in pixels. */ struct _IplROI *roi; /**< Image ROI. If NULL, the whole image is selected. */ struct _IplImage *maskROI; /**< Must be NULL. */ void *imageId; /**< " " */ struct _IplTileInfo *tileInfo; /**< " " */ int imageSize; /**< Image data size in bytes (==image->height*image->widthStep in case of interleaved data)*/ char *imageData; /**< Pointer to aligned image data. */ int widthStep; /**< Size of aligned image row in bytes. */ int BorderMode[4]; /**< Ignored by OpenCV. */ int BorderConst[4]; /**< Ditto. */ char *imageDataOrigin; /**< Pointer to very origin of image data (not necessarily aligned) - needed for correct deallocation */} IplImage;
width和height这两个变量很重要,其次是depth和nchannals。depth变量的值取自ipl.h中定义的一组数据,但与在矩阵中看到的对应变量不同。因为在图像中,我们往往将深度和通道数分开处理,深度值如下表
下面转一段别人总结的深度显示范围。
测试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
这个时候如果需要保存图像,请记住要先转换到IPL_DEPTH_8U的深度。因为只有8位单通道或者3通道(通道顺序为’BGR’)才可以使用cvSaveImage保存。
通道数nChannels可取的值是1,2,3或4
origin: 2种值(IPL_ORIGIN_TL 或者 IPL_ORIGIN_BL)分别设置坐标原点的位置于图像的左上角(TL->top left)或者左下角(BL->bottom left)
**ROI感兴趣区域**COI感兴趣通道
关于加载图片格式
cvLoadImage()寒素可以读取大多数格式类型的图像文件,这列类型包括BMP,DIB,JPEG,PNG,PBM,PGM,SR,RAS和TIFF。该函数执行完后将返回一个指针,此指针指向一个块为描述该图像文件的数据结构(IplImage)而分配的内存块。
关于加载颜色深度
enum{/* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED =-1,/* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE =0,/* ?, color */ CV_LOAD_IMAGE_COLOR =1,/* any depth, ? */ CV_LOAD_IMAGE_ANYDEPTH =2,/* ?, any color */ CV_LOAD_IMAGE_ANYCOLOR =4};
使用原始加载可以这样:
IplImage* src = cvLoadImage("01.jpg", CV_LOAD_IMAGE_ANYDEPTH || CV_LOAD_IMAGE_ANYCOLOR);
关于创建窗体
我们使用的是cvNamedWindow();函数它的定义如下:
/* create window */cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) )
参数1,name:类似于窗体的ID,也是它的名称
参数2,flags :是窗体的加载属性,它有如下值的定义如下:
//These 2 flags are used by cvNamedWindow and cvSet/GetWindowProperty CV_WINDOW_NORMAL = 0x00000000, //the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size CV_WINDOW_AUTOSIZE = 0x00000001, //the user cannot resize the window, the size is constrainted by the image displayed CV_WINDOW_OPENGL = 0x00001000, //window with opengl support
如何使用该函数?如下
cvNamedWindow("title",1);//创建一个窗体
其中数字值可以代替上面的flags定义好的宏值。
关于显示图片
我们使用的cvShowImage()函数,定义如下:
/* display image within window (highgui windows remember their content) */CVAPI(void) cvShowImage( const char* name, const CvArr* image );
参数1 , name : 待显示的窗体name
参数2,image:是要显示的图片资源,一个图片数据结构,对应的需要一个IplImage*类型的指针
使用该函数,该窗口将被重新绘制。
如何使用?如下
cvShowImage("title", src);//在窗体中显示图片
关于释放资源
该程序窗口所占用的一切资源都会由操作系统自动释放,对应简单的程序,可不必调用函数显示释放资源,但是,养成习惯每次都调用这些函数显示释放资源总是有好处的。
- OpenCV_加载一张图片
- 加载一张图片
- ios 加载一张本地图片
- Picasso加载一张图片的具体过程
- UIScrollView的图片缩放(只加载一张图片的时候)
- 用Qt加载一张图片----定时旋转图片
- css设置:在一张图片上加载另一张图片
- GridView初始时加载一张图片,点击后加载另外一张大图
- 加载一张bmp图片作为MFC对话框的背景
- 加载一张bmp图片作为MFC对话框的背景
- 【Unity】用Unity加载电脑C盘中的一张图片
- Android加载一张3.4MB的图片,不出现OOM
- Picasso解析(1)-一张图片是如何加载出来的
- Linux的opencv教程之加载一张图片
- 一张图片
- 一张图片
- 图片一张
- 一张图片
- CA证书相关的一些基础知识
- Centos Valgrind 的使用与安装
- ABAP数据库操作
- 欢迎使用CSDN-markdown编辑器
- 面试算法:链表成环的检测
- OpenCV_加载一张图片
- Cannot read property 'rownumbers' of undefined
- [React网络整理]React之表单组件的学习笔记
- 表单验证Jquery.validate表单验证
- java enum(枚举)使用详解 + 总结
- 我周围的生活
- nyoj 最长公共子序列(DP)
- 利用eval()处理返回的json字符串,json字符串转换为json
- IntelliJ Idea SpringBoot 数据库增删改查实例