收入囊中

  • 用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. Spring boot应用踩坑集锦

    Spring boot应用踩坑集锦 spring boot是spring的一种开发套件,是spring cloud的基础框架,要学习spring cloud微服务是绕不开的,遇到一些踩坑问题在这里记录 ...

  2. 《码出高效 Java开发手册》第一章计算机基础(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  3. SSH下shiro的基本使用

    1.引入依赖 <!-- 权限控制 框架 -->
 <dependency>
 <groupId>org.apache.shiro</groupId>
 ...

  4. Algorithm——两个排序数组的中位数

    ps:城际的网速还是不错的-

  5. NodeJs -- express 快速建站

    直接上干货 1.新建一个目录来存放我们即将要做的东西: 2.win+R打开小黑框:进入到我们的目录下: 3.首先我们要全局安装Express框架:**在这一步之前要确保你本机上安装了node:** n ...

  6. react解决roadhog buildDll 【转】

    本地删了 node module 目录,重新安装的时候,提示 找了找,可如下解决 ------- 转自: https://www.cnblogs.com/huhanhaha/p/7605722.htm ...

  7. 多线程下载英文Google地图

    1. pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...

  8. BadgeView使用

    BadgeView是第三方的插件,用来显示组件上面的标记,起到提醒的作用,下载地址如下:http://files.cnblogs.com/files/hyyweb/android-viewbadger ...

  9. 手动搭建 redis 集群

    转自http://meia.fun/article/1544161420745 手动搭建 redis 集群 redis 基本命令: 启动 redis 服务:redis-server xxx.conf ...

  10. 提示"Zend Optimizer not installed"卸载安装也不行,什么原因如何解决?

    如题:Zend Optimizer not installed可能原因及解决方法 Optimizer, Zend 在配置php服务器的时候,所有的东西都安装好了,就是浏览一个要求zend的程序的时候, ...