zoukankan      html  css  js  c++  java
  • OpenCV2马拉松第2圈——读写图片

    收入囊中

    • 用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图像转换成灰度图	ext{RGB[A] to Gray:} quad Y  leftarrow 0.299  cdot R + 0.587  cdot G + 0.114  cdot B

    写图片
    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 
     " );
       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----------------------------
    资源交换文件标识: %s
    文件大小: %d
    WAVE格式标识: %s
    波形格式标识: %s
    量化结果位数: %d
    PCM编码: %d
    单双通道: %d
    採样频率: %d
    比特率: %d
    块对齐: %d
    样本数据位数: %d
    DATA标识: %s
    音频数据大小: %d
    ",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







  • 相关阅读:
    Tor网络突破IP封锁,爬虫好搭档【入门手册】
    ubuntu python3相关
    toutiao url
    处理跨域请求
    Python使用虚拟环境
    Python删除文件,空文件夹,非空文件夹
    如何在jupyter中使用Python2和Python3
    推荐使用国内的豆瓣源安装Python插件
    Python数据库查询之组合条件查询-F&Q查询
    获取Django项目的全部url
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10698858.html
Copyright © 2011-2022 走看看