[转载] OpenCV2.4.3 CheatSheet学习(四)
五、数据的输入和输出
1. 将数据写入YAML(或XML)
注意,在OpenCV中,无论读写,文件的格式均由指定的后缀名确定。示例:
FileStorage fs("test.yml", FileStorage::WRITE);
fs << "i"<< 5 <<"r" << 3.1<< "str"<< "ABCDEFGH";
fs << "mtx"<< Mat::eye(3,3,CV_32F);
fs << "mylist"<< "["<< CV_PI<< "1+1"<< "{:"<< "month"<< 12<< "day"<< 31<< "year"<< 1969<< "}"<< "]";
fs << "mystruct"<< "{"<< "x"<< 1 <<"y" << 2<< "width"<< 100<< "height"<< 200<< "lbp"<< "[:";
const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};
fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));
fs << "]"<< "}";
读写方法基本和C++没什么两样,很简单哈。
用记事本或IE就可以打开test.yml文件,可以很清楚的看到文件中的数据结构:
%YAML:1.0
i: 5
r: 3.1000000000000001e+000
str: ABCDEFGH
mtx: !!opencv-matrix
rows: 3
cols: 3
dt: f
data: [ 1.,0., 0., 0., 1., 0., 0., 0., 1. ]
mylist:
-3.1415926535897931e+000
- "1+1"
- { month:12,day:31, year:1969 }
mystruct:
x: 1
y: 2
width:100
height:200
lbp: [ 0, 1,1, 0, 1, 1, 0, 1 ]
2. 将数据读回
FileStorage fs("test.yml", FileStorage::READ);
int i1 = (int)fs["i"];
double r1 = (double)fs["r"];
string str1 = (string)fs["str"];
Mat M;
fs["mtx"] >> M;
FileNode tl = fs["mylist"];
CV_Assert(tl.type() == FileNode::SEQ&& tl.size() == 3);
double tl0 = (double)tl[0];
string tl1 = (string)tl[1];
int m = (int)tl[2]["month"], d = (int)tl[2]["day"];
int year = (int)tl[2]["year"];
FileNode tm = fs["mystruct"];
Rect r;
r.x = (int)tm["x"], r.y = (int)tm["y"];
r.width = (int)tm["width"], r.height = (int)tm["height"];
int lbp_val = 0;
FileNodeIterator it = tm["lbp"].begin();
for(int k = 0; k < 8; k++, ++it)
lbp_val |= ((int)*it)<< k;
这段代码把上面写入文件的数据再读回来。
3. 读写图像,最常用的操作
imwrite("myimage.jpg", image);
Mat imagecolorcopy = imread("myimage.jpg", 1);
Mat imagegrayscalecopy = imread("myimage.jpg", 0);
和MATLAB中的同名函数用法基本一样,很方便。文件格式由指定的后缀名确定。
imread可以指定读取图像的格式,参数0就是CV_LOAD_IMAGE_GRAYSCALE,即读取为灰度图;参数1就是CV_LOAD_IMAGE_COLOR,即读取为彩色图。
可以支持如下文件格式:
BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM/ PGM / PPM (.pbm, .pgm, .ppm), Sun Raster (.sr), JPEG 2000(.jp2).
每种格式都支持8比特的单通道或3通道图像,PNG和JPEG2000格式支持16bit。
4. 从文件或相机中读取视频
VideoCapture cap;
if(argc>1)
cap.open(string(argv[1]));
else
cap.open(0);
Mat frame;
namedWindow("video", 1);
for(;;)
{
cap>> frame;
if(!frame.data)
break;
imshow("video", frame);
if(waitKey(30)>= 0)
break;
}
如果指定了相机名称则打开对应的相机,否则打开默认相机0。打开一个名叫video的窗口,以30ms为间隔显示视频,也就是约33.33fps。
六、GUI(Graphical User Interface)组件
namedWindow(winname,flags)
创建一个窗口,用于显示。
destroyWindow(winname)
销毁一个窗口。
destroyAllWindows()
销毁所有窗口。
imshow(winname, mtx)
在指定的窗口中显示图像。
waitKey(delay)
等待delay毫秒,如果delay为0则一直等待。返回值是按键值,常用于显示图像的刷新和对按键的处理。
createTrackbar(...)
创建一个滑动条。
setMouseCallback(...)
设置鼠标事件的回调函数。
可以从camshiftdemo.cpp以及其他OpenCV示例工程中学习GUI的详细使用方法。
七、相机校准、姿态估计、深度估计
相机校准主要用到了张正友的棋盘格校准法,在OpenCV文件夹里可以找到棋盘格图像pattern.png,打印下来贴到一个硬板上就可以用以下函数对相机参数进行校准了。
calibrateCamera()
利用对棋盘格的一系列抓拍图像对相机进行校准。
findChessboardCorners()
寻找棋盘格的角点。
剩下的我都没用过:
solvePnP()
stereoCalibrate()
stereoRectify()
initUndistortRectifyMap()
StereoBM, StereoSGBM
reprojectImageTo3D()
findHomography()
八、目标识别
matchTemplate
CascadeClassifier
HOGDescriptor
sume
2013/1/5
[转载] OpenCV2.4.3 CheatSheet学习(四)的更多相关文章
- [转载] OpenCV2.4.3 CheatSheet学习(一)
OpenCV向MATLAB靠拢,图像的操作方法变得不那么C了,更m了一些.比如,MATLAB中的常用函数imshow.imread.imwrite函数在OpenCV中已经有了同名的兄弟. 此外,Ope ...
- [转载] OpenCV2.4.3 CheatSheet学习(三)
四.图像处理(呵呵,重头戏来了) 1. 滤波 filter2D() 用核函数对图像做卷积. sepFilter2D() 用分解的核函数对图像做卷积. 首先,图像的每一行与一维的核kernelX做卷积: ...
- [转载] OpenCV2.4.3 CheatSheet学习(二)
二.矩阵操作(拷贝.洗牌.局部访问): src.copyTo(dst) 把src矩阵中的数据拷贝到dst. src.convertTo(dst, type,scale, shift) 缩放并转换到另外 ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- TweenMax动画库学习(四)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- SVG 学习<四> 基础API
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- SCARA——OpenGL入门学习四(颜色)
OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...
- [转载]Android开发者必须深入学习的10个应用开源项目
[转载]Android开发者必须深入学习的10个应用开源项目 原文地址:Android开发者必须深入学习的10个应用开源项目(http://blog.sina.com.cn/s/blog_7b8a63 ...
- ZigBee学习四 无线+UART通信
ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...
随机推荐
- IIS服务器不可用
很恼火,突然发现IIS中的应用程序不能浏览页面了,试了试任何一个aspx页面也打不开.重新用vs.net建立了个新的web应用程序,现象依旧. 电脑环境: win2003 问题现象: 1)当想浏览某个 ...
- spring 中常用的设计模式
一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...
- Linux后台运行java的jar包后台运行java -jar 命令
为什么java -jar 的命令终端的窗口关闭就停止运行了??tomcat中war的就不会? 关闭终端的窗口相当于ctrl+c的命令,关闭了窗口就相当于停止了java -jar这个进程,即ctrl+c ...
- 《Python之BMI计算》
<Python之BMI计算> 前段时间写了个 BMI 因为刚刚开始学 有几个错误 第一个: 厘米我当时也没注意因为觉得去掉0.00的话后面1866666666是正确的BMI值 刚刚去看看去 ...
- Spring JdbcTemplate详解(9)
JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...
- git使用中的问题
一.github ssh_exchange_identification: read: Connection reset by peer 和电脑环境有关,检查防火墙关了没有,是不是杀毒软件.安全卫士的 ...
- 2019-8-31-dotnet-获取程序所在路径的方法
title author date CreateTime categories dotnet 获取程序所在路径的方法 lindexi 2019-08-31 16:55:58 +0800 2019-03 ...
- 使用UUID和int自增主键的区别
知其然,知其所以然.在看到生成UUID的代码,后带给我的百度结合自己的经验再写下来的区别 一.UUID做主键: 优点: .保证数据在表和库都是独立的,有利于后续的分库 .合并表的时候主键不会重复 .有 ...
- 一个事件一定时间内只允许点击执行一次 与 vue阻止滚动穿透
可能我的方法很笨,简单实现来的就是给两个状态,一个状态点击时就发生改变,另外一个给一个定时器延迟改变 篮圈部分,给了两种状态,一个isDisable,一个comeTime 点击事件以后comeTime ...
- day 45 前端CSS
前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式 ...