将图片在指定窗口中显示-OpenCV应用学习笔记一

1、OpenCV模块划分
OpenCV其实就是一堆用C和C++语言来实现计算机视觉算法的源代码文件;例如C接口函数cvCany()实现了Canny边缘提取算法,我们可以直接将这些源代码添加到自己的软件项目中,而不需要自己去写代码实现Canny算法。同时由于源文件居多,所以根据算法的功能将源文件分到多个模块中(如下),将每个模块中的源文件编译成一个库文件(如opencv_core.lib、opencv_highgui.lib),用户调用时仅将所需的库文件添加到自己的项目中,与自己的源文件一起连接成可执行程序即可。
OpenCV2.0主体分为五个模块:
1、CV图像处理和视觉算法
2、MLL统计分类器
3、HighGUI图像和视频输入/输出
4、CXCORE(基本结构和算法,XML支持,绘图函数)
5、CvAux(存放即将被淘汰的算法和函数,新出现的实验性算法和函数)
(CVCAM摄像机接口属于OpenCV1.0版内容,在以后的版本中被弃用)
2、命令行参数 argc/argv
c/c++语言中的main函数,经常带有参数argc,argv,如下:
int main(int argc,char** argv)或者int main(int argc,char* argv[])
*1、argc:命令行输入参数个数,以空白符分隔
*2、argv:中存储了命令行参数
*3、如下图在dos命令下进入到openpictures.exe文件所在目录下运行命令:openpictures.exe lena.jpg lena2.jpg
那么有:argc=3,argv[0] = openpictures.exe,argv[1] = lena.jpg,argv[2] = lena2.jpg。

3、麻雀虽小五脏俱全之典例精析
实现功能:
输入openpictures.exe lena.jpg命令符后,执行:显示lena.jpg图片的功能
输入openpictures.exe lena.jpg lena2.jpg命令符后,执行:显示lena.jpg图像、并将其写入lena2.jpg文件
(你会发现在lena.jpg所在文件目录下多出来一个lena2.jpg文件并且跟lena.jpg图片信息一样)
函数精析:
cvLoadImage(fileName,flag)
- 将图像文件fileName以flag代表的格式加载至内存
- fileName包含文件的扩展名,确定被加载文件的格式;例如lena.jpg
- flag<0:默认读取图像的原通道数;flag=0:强制以单通道灰度形式读取;flag>0:强制以三通道形式读取
- 高层调用接口,通过fileName确定被加载文件的格式,并且该函数将自动分配图像数据结构所需的内存。函数执行完后将返回一个指针,此指针指向一块为描述该图像文件的数据结构而分配的内存块。
cvNamedWindow(“win1”,CV_WINDOW_AUTOSIZE)
- 用于在屏幕上创建一个窗口,将被显示的图片包含于该窗口中
- win1:指定了窗口的标题,其他函数与该窗口进行交互使用时,通过该参数值引用这个窗口
- 第二个参数定义了窗口的属性,通常设为CV_WINDOW_AUTOSIZE/1,两者等价:表示窗口大小会自动调整以适应被显示的图像,并且不能够手动调节大小。设为>=0的其他数值时:图像只能在窗口中根据窗口大小进行拉伸或缩放。
cvShowImage(“win1”,img)
- 将在制定的窗口win1中显示图像img
- 参数1:显示图像的窗口标识符;参数2:要被显示的图像
- 该函数调用时窗口将被重新绘制,同时图像也会显示在窗口中
- 只要有一个与某个图像文件相对应的IplImage*类型指针,我们就可以在一个已创建好的窗口中使用该函数显示该图像
cvWaitKey(int delay)
- delay<=0时:永久等待;delay>0时:等待至少delay毫秒时间,因为考虑到操作系统切换时间
- 在没有按键按下时,函数等待delay 毫秒时间长后返回-1;如果按键按下则返回按键的ASCII码,然后继续执行程序
- fileName包含文件的扩展名,确定被加载文件的格式;例如lena.jpg
- flag<0:默认读取图像的原通道数;flag=0:强制以单通道灰度形式读取;flag>0:强制以三通道形式读取
cvReleaseImage(&img)
- 一旦用完加载到内存的图像文件,我们就可以释放该图像文件所分配的内存。调用完毕后img指针将被设置为NULL。
cvDestoryWindow(“win1”)
- 销毁显示图像文件的窗口;关闭窗口并释放该窗口所分配的所有内存(包括窗口内部的图像内存缓区:保存了与img指针相关的图像文件像素的一个副本)。
- 当应用程序的窗口被关闭时,该应用程序窗口所占用的一切资源都会由操作系统自动释放,所以对一些简单的程序,不必调用cvDestroy()或cvReleaseImage()函数显式释放资源。但是,养成习惯每次都调用这些函数显式释放资源总是好的
cvMoveWindow(“win1”,int x,int y)
- 移动win1窗口到指定的坐标(x,y)位置
- 默认显示屏左上角为原点;x,y:为偏移位置
cvResizeWindow(“win1”,int width,int height)
- 设定窗口尺寸为指定宽度和高度
- 设定的窗口尺寸是指显示图像的窗口尺寸,不包含拖动条
- 只有创建的窗口flag属性不为CV_WINDOW_AUTOSIZE时才能够调用此函数
cvGetSize(const CvArr* arr)
- 函数返回输入矩阵或者图像arr的行数和列数;当为图像时返回感兴趣区域的尺
- cvCreateImage(CvSize size,int depth,int channels)
- 创建图像头并且分配图像数据;返回IplImage结构
- size:图像的宽度和高度;depth:图像像素的位深度;channels:图像的通道数
- 位深度:可以使有的选择如下:
IPL_DEPTH_8U:无符号8bit整型
IPL_DEPTH_8S:无符号8bit整型
IPL_DEPTH_16U:无符号16bit整型
IPL_DEPTH_16S:有符号16bit整型
IPL_DEPTH_32S:有符号32bit整型
IPL_DEPTH_32F:单精度浮点数
IPL_DEPTH_64F:双精度浮点数
cvCopy(const CvArr* src,const CvArr* dst,const CvArr* mask)
- 函数复制一个数组数据到另一个数组中
- src:源输入数组;dst:输出数组;mask:操作掩码,必须为8位单通道数组,指定输出数组的被改变元素
- dst(i) = src(i) if mask(i) != 0
- 输入输出数组必须为同类型,维数大小相同;如果是IplImage类型,则ROI和COI将被使用
cvSaveImage(const char* filename,const CvArr* Image)
- 保存图像Image到指定文件filename
附源代码:
#include "stdafx.h"
#include "highgui.h" int main(int argc, char** argv)
{
IplImage* pImg; //声明IplImage指针 if(argc == && (pImg = cvLoadImage(argv[],)) != ) //当(“输入两个字符串”并且“成功读入图片”)时
{
cvNamedWindow("Image",); //创建标题为Image的窗口,并且随实际图片大小改变窗口尺寸
cvShowImage("Image",pImg); //在Image窗口内显示pImg指针所指图像
cvWaitKey(); //等待按键
cvDestroyWindow("Image"); //销毁窗口
cvReleaseImage(&pImg); //释放图像
return ;
} else if(argc == && (pImg = cvLoadImage(argv[],)) != ) //当(“输入三个字符串”并且“成功读入图片”)时
{
IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels); //以图像pImg的格式创建图像pImg2
cvCopy(pImg,pImg2,NULL); //复制pImg图像数据到pImg2
cvSaveImage(argv[],pImg2); //把图像pImg2写入以输入第三个字符串为名字的文件中
cvNamedWindow("Image",); //创建窗口
cvShowImage("Image",pImg); //显示图像
cvWaitKey(); //等待按键
cvDestroyWindow("Image"); //销毁窗口
cvReleaseImage(&pImg); //释放图像
return ;
}
return -;
}
将图片在指定窗口中显示-OpenCV应用学习笔记一的更多相关文章
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- OpenGL编程逐步深入(三)在窗口中显示一个三角形
这一节教程的内容会比较少,我们仅仅是对上一节教程中的代码进行扩展,在窗口中渲染一个三角形出来. 本节我们以下图所示正方形来讲解OpenGl中的坐标系统.当沿着Z轴负方向看时,可见顶点的坐标必须在这个正 ...
- OpenGL编程逐步深入(二)在窗口中显示一个点
准备知识 在本文中我们将会接触到OpenGl的扩展库GLEW( OpenGL Extension Wrangler Library),GLEW可以帮助我们处理OpenGl中繁琐的扩展管理.一旦初始化后 ...
- mysql数据库导出模型到powerdesigner,PDM图形窗口中显示数据列的中文注释
1,mysql数据库导出模型到powerdesigner 2,CRL+Shift+X 3,复制以下内容,执行 '******************************************** ...
- IDA 在string窗口中显示中文字符串
打开ida61\cfg中的ida.cfg文件找到 // (cp866 version)AsciiStringChars = "\r\n\a\v\b\t\x1B" " !\ ...
- 转 在PowerDesigner的PDM图形窗口中显示数据列的中文注释
Name是名称(字段描述),Code是字段名称,Comment是注释名称,ER图中显示的是Name.一般设计时,Name跟comment都设计成描述, 而设计时候常把comment写成中文,name保 ...
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- Frameset框架,在同一个浏览器窗口中显示不止一个页面
总结一下.通过使用Frameset框架,可以在同一个浏览器窗口中显示不止一个页面. 先举个例子: 1 <frameset rows="100,*" cols="*& ...
- OpenCV图像处理学习笔记-Day1
OpenCV图像处理学习笔记-Day1 目录 OpenCV图像处理学习笔记-Day1 第1课:图像读入.显示和保存 1. 读入图像 2. 显示图像 3. 保存图像 第2课:图像处理入门基础 1. 基本 ...
随机推荐
- kafka java实例
生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...
- Python:线程
Python中创建线程有两种方式:函数或者用类来创建线程对象. 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程. 类:创建threading.Thread的 ...
- Python:socket
Socket:又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyt ...
- asp.net应用程序生命周期和asp.net网页的生命周期
一.asp.net应用程序生命周期 asp.net应用程序生命周期以浏览器向web服务器(比如IIS服务器)发送请求为起点,先后经历web服务器下的ISAPI(Internet Server Appl ...
- 选择流程—— switch if else结构
一.switch switch(表达式){ case 常量1: 语句; break; case 常量2: 语句; break; … default; 语句; } 例题:运用switch结构实现购物管理 ...
- 【如何快速的开发一个完整的iOS直播app】(播放篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkpl ...
- Python Decorator分析
decorator本身是一个函数,这个函数的功能是接受被修饰的函数(decorated)作为参数,返回包装函数(wrapper)替换被修饰函数(decorated). @decorator func ...
- mysql主从不一致解决方法
方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 stop slave; #表示跳过一步错误,后面的数字可变 set global ...
- [OSI]网络7层模型的理解
应用层:HTTP 应用层 表现层:编码 表现层 会话层:端口 会话层 传输层:TCP/UDP 协议 传输层 网络层:IP 标记 +-- 网络层 --+ 网络层 数据链路层:计算机Mac地址标记 | ...
- mysql数据表操作&库操作
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...