OpenCV2马拉松第2圈——读写图片
收入囊中
- 用imread读取图片
- 用nameWindow和imshow展示图片
- cvtColor彩色图像灰度化
- imwrite写图像
- Luv色彩空间转换
图像读取接口
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;
}
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圈——读写图片的更多相关文章
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...
- OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)
收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...
- OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...
- OpenCV2马拉松第10圈——直方图反向投影(back project)
收入囊中 灰度图像的反向投影 彩色图像的反向投影 利用反向投影做object detect 葵花宝典 什么是反向投影?事实上没有那么高大上! 在上一篇博文学到,图像能够获得自己的灰度直方图. 反向投影 ...
- openCV2马拉松第19圈——Harris角点检測(自己实现)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...
- openCV2马拉松第18圈——坐标变换
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 仿射变换 坐标映射 利用坐标映射做一些效果,例如以下 watermark/ ...
- OpenCV2马拉松第13圈——模版匹配
收入囊中 在http://blog.csdn.net/abcd1992719g/article/details/25505315这里,我们已经学习了怎样利用反向投影和meanshift算法来在图像中查 ...
- OpenCV2马拉松第9圈——再谈对照度(对照度拉伸,直方图均衡化)
收入囊中 lookup table 对照度拉伸 直方图均衡化 葵花宝典 lookup table是什么东西呢? 举个样例,假设你想把图像颠倒一下,f[i] = 255-f[i],你会怎么做? for( ...
随机推荐
- CSS3完善和模式
CSS3改善了传统盒模型架构,增强盒子构成要素的功能,扩展了盒模型显示的方式,具体描述如下 改善构造:除了传统的内容区域,边框区,补白区和边界区外,为盒子新增了轮廓区. 增强功能:内容增强CSS自动添 ...
- Java JDK 配置环境变量
使用了java也有了两年了,安装了很多次jdk都记不住安装步骤 = =,刚刚又配置了一次,码一下步骤: 1.右击"此电脑" ---> "属性" ----& ...
- servlet(一):从Sevlet到HttpServlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. servlet ...
- python学习之老男孩python全栈第九期_数据库day001 -- 作业
创建如图所示数据库: 创建过程: 查看数据库,创建数据库 db1,再查看一下数据库 进入数据库,查看一下表 接着再创建一个class表 发现增加了重复数据,因此要把第二个修改一下 修改完数据之 ...
- BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)
题意 题目链接 Sol 介绍一种神奇的点分治的做法 啥?这都有根树了怎么点分治?? 嘿嘿,这道题的点分治不同于一般的点分治.正常的点分治思路大概是先统计过重心的,再递归下去 实际上一般的点分治与统计顺 ...
- 小程序视图层(xx.xml)和逻辑层(xx.js)
整个系统分为两块视图层(View)和逻辑层(App Service) 框架可以让数据与视图非常简单地保持同步.当做数据修改的时候,只需要在逻辑层修改数据,视图层就会做相应的更新. 通过这个简单的例子来 ...
- HTML5之全局属性 (声明:内容节选自《HTML 5从入门到精通》)
contentEditable ———————————————————————————————————————————————————————— 功能:允许用户编辑元素中的内容. 功能说明: ...
- Vmware搭建LNMP环境(Centos7+Nginx+Mysql+PHP7.1.8)
参考:1.Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程) 2.Centos7搭建LNMP环境 3.MySQL5.7修改默认root密码 4.CentO ...
- R下载package的一些小问题
1.Error in install.packages : unable to create ‘C:/Users/???/Documents/R/win-library\3.5 采用管理员身份运行,先 ...
- vue实现上传上删除压缩图片
<script> import {Config} from '@/config.js' import {mapState} from 'vuex' import {LocalData, t ...