OpenCV2马拉松第2圈——读写图片
来源:互联网 发布:09霍华德vs詹姆斯数据 编辑:程序博客网 时间:2024/04/30 21:28
收入囊中
- 用imread读取图片
- 用nameWindow和imshow展示图片
- cvtColor彩色图像灰度化
- imwrite写图像
- Luv色彩空间转换
初识API
图像读取接口- CV_LOAD_IMAGE_UNCHANGED (<0) 图片怎么样就怎么读取(包括透明度这个通道)
- CV_LOAD_IMAGE_GRAYSCALE ( 0)
- CV_LOAD_IMAGE_COLOR (>0) RGB读取
建立窗口
如果你不是在 Qt这种平台上面,WINDOW_AUTOSIZE足够,会保持图片原有得尺寸展示窗口
完整程序
#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是色度)
函数接口 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )最后一个是通道数,如果为0则继承自src的通道,CV_BGR2GRAY是常用的一个参数,将RGB图像转换成灰度图
写图片
#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;}
举一反三:
- 虽然我们都说RGB,但实际存储是BGR,第一个byte是blue
- 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再进行转化.
你可能会思考OpenCV的imread是怎么做的,我们知道,计算机存储的是二进制,任何文件都是。
主要知道文件的组织格式,任何文件都能读取,比如,我要读取wav格式文件,如下代码。
#include<iostream>#include<fstream>#include<cstdio>#include<stdlib.h>#include<vector>#include<cmath>using namespace std;/************* Wav file Struct *************************** *占用空间数据类型含义 *4bytescharRIFF,资源交换文件标识 *4bytesint从下一个地址开始到文件尾的总字节数 *4bytescharWAVE,代表wave格式 *4bytescharFMT,波形格式标识 *4bytesintsizeof(PCMWAVEFORMAT),量化结果大小 *2bytesshort为1表示线性PCM编码,否则表示有压缩的编码 *2bytesshort1为单身道,2为双声道 *4bytesint采样频率 *4bytesint比特率,比特率=采样频率*音频通道数*每次采样得到的样本位数/8 *2bytesshort块对齐 *2bytesshort样本数据位数 *4byteschar"data",一个标识 *4bytesintwav文件实际音频数据所占的大小 ***********************************************************/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;//用于存储所有的signalfloat 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
12 2
- OpenCV2马拉松第2圈——读写图片
- OpenCV2马拉松第4圈——图片混合
- OpenCV2马拉松第1圈——纵观全局
- OpenCV2马拉松第5圈——线性滤波
- OpenCV2马拉松第6圈——非线性滤波
- OpenCV2马拉松第7圈——图像金字塔
- OpenCV2马拉松第8圈——绘制直方图
- OpenCV2马拉松第12圈——直方图比较
- OpenCV2马拉松第13圈——模版匹配
- openCV2马拉松第18圈——坐标变换
- OpenCV2马拉松第24圈——轮廓提取
- OpenCV2马拉松第3圈——改变对比度和亮度
- OpenCV2马拉松第9圈——再谈对比度(对比度拉伸,直方图均衡化)
- OpenCV2马拉松第10圈——直方图反向投影(back project)
- OpenCV2马拉松第11圈——meanshift与直方图反向投影
- OpenCV2马拉松第14圈——边缘检测(Sobel,prewitt,roberts)
- OpenCV2马拉松第15圈——边缘检测(Laplace算子,LOG算子)
- OpenCV2马拉松第16圈——边缘检测(形态学梯度)
- SQL2008 安装需要重启计算机
- Linux 调用动态库(.SO文件)总结
- 自己建立一个结构体类型,里面有结构体的浅拷贝以及赋值;调用函数排序,void main5避免野指针
- 二叉树的镜像(剑指offer19)
- oc7
- OpenCV2马拉松第2圈——读写图片
- 排序一个字符串数组,使用数组的的方法排序 第二种内存模型;
- 第二章编程示例 笔记
- 终端中常用的shell 命令
- dbms_stats 导入导出 表级别 统计信息
- php引号的正确使用
- java 设置定时任务的时间
- 使用一级指针排序一个字符串数组
- 一行代码完成并行任务