收入囊中
#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; }
#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; }
你可能会思考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