OpenCV2馬拉松第2圈——讀寫圖片
阿新 • • 發佈:2019-04-13
計算機 bold otto any lock value ons 壓縮 cst
初識API 圖像讀取接口
建立窗體
展示窗體
完整程序
改變色彩空間,這是一個極其復雜的函數。要全然掌握須要非常多知識,總之你要知道RGB僅僅是一種表示方式,在實際處理中還有其它更好的色彩空間(如LUV,L表示物體亮度,u和v是色度)
最後一個是通道數。假設為0則繼承自src的通道,CV_BGR2GRAY是經常使用的一個參數。將RGB圖像轉換成灰度圖
寫圖片
舉一反三:
收入囊中
- 用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;
}
舉一反三:
- 盡管我們都說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再進行轉化.
-
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圈——讀寫圖片