收入囊中

  • 用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. PHP 错误解决锦集

    Part1:Maximum execution time of 120 seconds exceeded 120秒运行超时的错误 解决办法: 方法一,修改php.ini文件 max_execution ...

  2. css之背景(background)家族

    背景(background)是css中很重要的一部分,也是css的基础知道之一,现在来回顾css2中5个属性与css3中新增的3个属性和2个功能. CSS2_背景(background)前传 家族成员 ...

  3. react组件里阻事件冒泡

    e.nativeEvent.stopImmediatePropagation();

  4. JS中Date.parse()和Date.UTC()返回值不一致

    Date.parse() 方法解析一个表示某个日期的字符串,并返回从1970-1-1 00:00:00 UTC 到该日期对象(该日期对象的UTC时间)的毫秒数,如果该字符串无法识别,或者一些情况下,包 ...

  5. linux 根据进程名杀死进程 -kill进程名

    前两天一个老师给我出了一个linux操作上的问题,现在知道进程名怎样杀死这个进程.或许很多人都会和我一样说用 #pkill 进程名 或是 #killall 进程名 的确这个两个命令都能做到这些,而且我 ...

  6. Tomcat、Apache、IIS这三种Web服务器来讲述3种搭建JSP运行环境的方法

    一.相关软件介绍 1. J2SDK:Java2的软件开发工具,是Java应用程序的基础.JSP是基于Java技术的,所以配置JSP环境之前必须要安装J2SDK. 2. Apache服务器:Apache ...

  7. 132.1.001 Union-Find | 并查集

    @(132 - ACM | 算法) Algorithm | Coursera - by Robert Sedgewick > Tip: Focus on WHAT is really impor ...

  8. redis 概述、windows版本下载启动访问退出安装、中文乱码、RedisDesktopManager下载

    redis 概述 redis的key是string类型的:value有多种类型,但放入的不是特定类型数据,添加的都是string,只是redis把这些值组织成了各种数据结构.key和相应的值都是str ...

  9. Swagger RESTful API文档规范

    *注意编写的关键词:“必须”.“不能”.“需要”.“应当”,“不得”.“应该”.“不应该”,“推荐”.“可能”和“可选的” 原文链接:http://swagger.io/specification/ ...

  10. 【Java】数组使用

    package aaa; public class aaa { public static void main(String args[]) { int a[]={1,2,3,4}; for(int ...