收入囊中

  • 用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. Jquery 筛选选择器

    筛选选择器(方法) 既然是方法 那就应该对象调用   obj.metch(); $(“.dd”).children("ul"),show();           //找到.dd下 ...

  2. webfrom后台

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  3. solr+tomcat整合

    一.solr安装 http://archive.apache.org/dist/lucene/solr/ 这个地址有各个版本的 这次我使用的是5.5.4版本和tomcat8 版本5.5.4已经内置了j ...

  4. mysql,存储引擎,事务,锁,慢查询,执行计划分析,sql优化

    基础篇:MySql架构与存储引擎 逻辑架构图: 连接层: mysql启动后(可以把mysql类比为一个后台的服务器),等待客户端请求,当请求到来后,mysql建立一个一个线程处理(线程池则分配一个空线 ...

  5. xamarin.Android 选择本地图片、拍摄图片、剪裁图片

    [Activity(Theme = "@style/MyStyleBottom")] public class SelectPicPopupWindow : Activity, I ...

  6. 在GDI+中如何实现以左下角为原点的笛卡尔坐标系

    今天写了一个求点集合的凸包的一个算法,虽然结果求解出来了,但是想将过程用GDI+绘制出来,就需要将点绘制出来,然而c#GDI+中绘图的坐标与我们常用数学中笛卡尔坐标系是不一样的,所以就要转换GDI+中 ...

  7. [微信小程序]微信开发工具出现 1not found 编译 .wxss文件信息错误怎么办?

    错误代码: "1not found 编译 .wxss文件信息错误",如 下图 出现场景: 1.一般出现在安装新版本之后出现的状况,可能由于版本之间的兼容导致 解决办法: 1.重装整 ...

  8. 【c++错误】类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)

    今天编写类的程序的时候不小心把类后的分号忘写了,就出现上面的错误提示. 顺便复习下类的正确格式: class 类名 { public: //习惯上将公有类型放在前面,便于阅读 ……(外部接口) pro ...

  9. ubuntu中获取文件名称并生成txt文件

    简介: 在机器视觉学习过程中,通常会经常批量处理一些图片,在Ubuntu下可以使用find命令,来实现将文件名全部读取出来,生成列表txt文件,作为标签使用 (1)find命令格式如下: find / ...

  10. opencv3.2.0图像离散傅里叶变换

    源码: ##名称:离散傅里叶变换 ##平台:QT5.7.1+opencv3.2.0 ##日期:2017年12月13. /**** 新建QT控制台程序****/ #include <QCoreAp ...