收入囊中

  • 用imread读取图片
  • 用nameWindow和imshow展示图片
  • cvtColor彩色图像灰度化
  • imwrite写图像
  • Luv色彩空间转换
初识API

图像读取接口

image = imread(argv[1], CV_LOAD_IMAGE_COLOR);
  • CV_LOAD_IMAGE_UNCHANGED (<0) 图片怎么样就怎么读取(包含透明度这个通道)
  • CV_LOAD_IMAGE_GRAYSCALE ( 0) 
  • CV_LOAD_IMAGE_COLOR (>0) RGB读取
建立窗体
    namedWindow( "Display window", WINDOW_AUTOSIZE );

假设你不是在 Qt这样的平台上面。WINDOW_AUTOSIZE足够,会保持图片原有得尺寸

展示窗体
  imshow( "Display window", image ); //注意这里的名字要和nameWindow建立的窗体名字一样

完整程序
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream> using namespace cv;
using namespace std; int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
return -1;
} Mat image;
image = imread(argv[1], CV_LOAD_IMAGE_COLOR); if(! image.data )
{
cout << "Could not open or find the image" << std::endl ;
return -1;
} namedWindow( "Display window", WINDOW_AUTOSIZE );
imshow( "Display window", image ); waitKey(0); //等待键盘时间
return 0;
}
改变色彩空间,这是一个极其复杂的函数。要全然掌握须要非常多知识,总之你要知道RGB仅仅是一种表示方式,在实际处理中还有其它更好的色彩空间(如LUV,L表示物体亮度,u和v是色度)
cvtColor( image, gray_image, CV_BGR2GRAY );

函数接口    C++: void cvtColor(InputArray src,
OutputArray dst, int code,
int dstCn=0 )
最后一个是通道数。假设为0则继承自src的通道,CV_BGR2GRAY是经常使用的一个參数。将RGB图像转换成灰度图

写图片
imwrite( "./Gray_Image.jpg", gray_image );

#include <cv.h>
#include <highgui.h> using namespace cv; int main( int argc, char** argv )
{
char* imageName = argv[1]; Mat image;
image = imread( imageName, 1 ); if( argc != 2 || !image.data )
{
printf( " No image data \n " );
return -1;
} Mat gray_image;
cvtColor( image, gray_image, CV_BGR2GRAY ); imwrite( "./Gray_Image.jpg", gray_image ); namedWindow( imageName, CV_WINDOW_AUTOSIZE );
namedWindow( "Gray image", CV_WINDOW_AUTOSIZE ); imshow( imageName, image );
imshow( "Gray image", gray_image ); waitKey(0); return 0;
}
举一反三:
  1. 尽管我们都说RGB,但实际存储是BGR,第一个byte是blue
  2. CV_32F is float - the pixel can have any value between 0-1.0, this is useful for some sets of calculations on data - but
    it has to be converted into 8bits to save or display by multiplying each pixel by 255(from stackoverflow).就是说CV_32F是0.0-1.0的,当我们要储存时候。必须乘255转换成整数,当一个unsigned
    char 3通道的图片要转换成Luv空间的时候,我们也要先除255再进行转化.
  3. img *= 1./255;
    cvtColor(img, img, CV_BGR2Luv);

你可能会思考OpenCV的imread是怎么做的,我们知道。计算机存储的是二进制。不论什么文件都是。

主要知道文件的组织格式,不论什么文件都能读取。比方,我要读取wav格式文件。例如以下代码。

#include<iostream>
#include<fstream>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<cmath> using namespace std; /************* Wav file Struct ***************************
* 占用空间 数据类型 含义
* 4bytes char RIFF,资源交换文件标识
* 4bytes int 从下一个地址開始到文件尾的总字节数
* 4bytes char WAVE,代表wave格式
* 4bytes char FMT,波形格式标识
* 4bytes int sizeof(PCMWAVEFORMAT),量化结果大小
* 2bytes short 为1表示线性PCM编码,否则表示有压缩的编码
* 2bytes short 1为单身道,2为双声道
* 4bytes int 採样频率
* 4bytes int 比特率,比特率=採样频率*音频通道数*每次採样得到的样本位数/8
* 2bytes short 块对齐
* 2bytes short 样本数据位数
* 4bytes char "data",一个标识
* 4bytes int wav文件实际音频数据所占的大小
***********************************************************/
typedef struct _WavHeader
{
char wav_RIFF[4];
int wav_FileSize;
char wav_WAVE[4];
char wav_FMT[4];
int wav_PCM;
short wav_PCMCode;
short wav_Channel;
int wav_SampleRate;
int wav_AvgBytePerSecond;
short wav_BlockAlign;
short wav_BitsPerSample;
char wav_DATA[4];
int wav_AudioSize;
} wavHeader; const float a = 0.95; //预强调系数
const int FrameLen = 256; //帧长
const int FrameShift = 100; //帧移
const double PI = 3.1415926;
vector<short>buffer; //用于存储全部的signal
float Hamming[FrameLen]; //汉明窗 void InitHamming(); //用于汉明窗的初始化
void HammingWindow(vector<short>&, int, float*); //对数据加窗 int main(int argc, char **argv)
{
wavHeader waveheader;
FILE* wavefile = fopen(argv[1], "rb");
fread(&waveheader, sizeof(struct _WavHeader), 1, wavefile);
printf("---------------------------wav file info----------------------------\n资源交换文件标识: %s\n文件大小: %d\nWAVE格式标识: %s\n波形格式标识: %s\n量化结果位数: %d\nPCM编码: %d\n单双通道: %d\n採样频率: %d\n比特率: %d\n块对齐: %d\n样本数据位数: %d\nDATA标识: %s\n音频数据大小: %d\n",waveheader.wav_RIFF, waveheader.wav_FileSize, waveheader.wav_WAVE, waveheader.wav_FMT,waveheader.wav_PCM, waveheader.wav_PCMCode, waveheader.wav_Channel, waveheader.wav_SampleRate, waveheader.wav_AvgBytePerSecond,waveheader.wav_BlockAlign, waveheader.wav_BitsPerSample, waveheader.wav_DATA, waveheader.wav_AudioSize); return 0;
}

以下是我的输出,所以,读取文件就是这样工作的

---------------------------wav file info----------------------------

资源交换文件标识: RIFF$+

文件大小: 338724

WAVE格式标识: WAVEfmt 

波形格式标识: fmt 

量化结果位数: 16

PCM编码: 1

单双通道: 1

採样频率: 22050

比特率: 88200

块对齐: 4

样本数据位数: 32

DATA标识: data

音频数据大小: 338688

计算机视觉讨论群162501053

转载请注明:http://blog.csdn.net/abcd1992719g

OpenCV2马拉松第2圈——读写图片的更多相关文章

  1. OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...

  2. OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)

    收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...

  3. OpenCV2马拉松第22圈——Hough变换直线检測原理与实现

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...

  4. OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)

    收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...

  5. OpenCV2马拉松第10圈——直方图反向投影(back project)

    收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...

  6. openCV2马拉松第19圈——Harris角点检測(自己实现)

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...

  7. openCV2马拉松第18圈——坐标变换

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 仿射变换 坐标映射 利用坐标映射做一些效果,例如以下 watermark/ ...

  8. OpenCV2马拉松第13圈——模版匹配

    收入囊中 在http://blog.csdn.net/abcd1992719g/article/details/25505315这里,我们已经学习了怎样利用反向投影和meanshift算法来在图像中查 ...

  9. OpenCV2马拉松第9圈——再谈对照度(对照度拉伸,直方图均衡化)

    收入囊中 lookup table 对照度拉伸 直方图均衡化 葵花宝典 lookup table是什么东西呢? 举个样例,假设你想把图像颠倒一下,f[i] = 255-f[i],你会怎么做? for( ...

随机推荐

  1. CSS3完善和模式

    CSS3改善了传统盒模型架构,增强盒子构成要素的功能,扩展了盒模型显示的方式,具体描述如下 改善构造:除了传统的内容区域,边框区,补白区和边界区外,为盒子新增了轮廓区. 增强功能:内容增强CSS自动添 ...

  2. Java JDK 配置环境变量

    使用了java也有了两年了,安装了很多次jdk都记不住安装步骤 = =,刚刚又配置了一次,码一下步骤: 1.右击"此电脑" ---> "属性" ----& ...

  3. servlet(一):从Sevlet到HttpServlet

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. servlet ...

  4. python学习之老男孩python全栈第九期_数据库day001 -- 作业

    创建如图所示数据库: 创建过程:  查看数据库,创建数据库 db1,再查看一下数据库  进入数据库,查看一下表  接着再创建一个class表 发现增加了重复数据,因此要把第二个修改一下  修改完数据之 ...

  5. BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)

    题意 题目链接 Sol 介绍一种神奇的点分治的做法 啥?这都有根树了怎么点分治?? 嘿嘿,这道题的点分治不同于一般的点分治.正常的点分治思路大概是先统计过重心的,再递归下去 实际上一般的点分治与统计顺 ...

  6. 小程序视图层(xx.xml)和逻辑层(xx.js)

    整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新. 通过这个简单的例子来 ...

  7. HTML5之全局属性 (声明:内容节选自《HTML 5从入门到精通》)

    contentEditable ———————————————————————————————————————————————————————— 功能:允许用户编辑元素中的内容. 功能说明:      ...

  8. Vmware搭建LNMP环境(Centos7+Nginx+Mysql+PHP7.1.8)

    参考:1.Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程) 2.Centos7搭建LNMP环境 3.MySQL5.7修改默认root密码 4.CentO ...

  9. R下载package的一些小问题

    1.Error in install.packages : unable to create ‘C:/Users/???/Documents/R/win-library\3.5 采用管理员身份运行,先 ...

  10. vue实现上传上删除压缩图片

    <script> import {Config} from '@/config.js' import {mapState} from 'vuex' import {LocalData, t ...