《学习OpenCV》课后习题解答7
题目:(P105)
创建一个结构,结构中包含一个整数,一个CvPoint和一个 CvRect;称结构体为“my_struct”。
a. 写两个函数:void Write_my_strct(CvFileStorage* fs, const char * name, my_struct* ms) 和 void read_my_struct(CvFileStorage* fs, CvFileNode* ms_node, my_struct* ms)
b. 创建一个元素为my_struct结构体且长度为10的数组,并将数组写入磁盘和从磁盘读入内存。
解答:
#include<cv.h>
#include<highgui.h>
typedef struct my_struct {
int integer;
CvPoint ptr;
CvRect rect;
}my_struct;
void write_my_struct(CvFileStorage* fs, const char* name, my_struct* ms) {
cvWriteInt(fs, "integer", ms[0].integer);
cvStartWriteStruct(fs, "ptr", CV_NODE_SEQ);
cvWriteInt(fs, NULL, ms[0].ptr.x);
cvWriteInt(fs, NULL, ms[0].ptr.y);
cvEndWriteStruct(fs);
cvStartWriteStruct(fs, "rect", CV_NODE_SEQ);
cvWriteInt(fs, NULL, ms[0].rect.x);
cvWriteInt(fs, NULL, ms[0].rect.y);
cvWriteInt(fs, NULL, ms[0].rect.width);
cvWriteInt(fs, NULL, ms[0].rect.height);
cvEndWriteStruct(fs);
}
void read_my_struct(CvFileStorage* fs, CvFileNode* ms_node, my_struct* ms) {
int integer = cvReadIntByName(fs, NULL, "integer", 5);
CvSeq* seq = cvGetFileNodeByName(fs, NULL, "ptr")->data.seq;
int ptr_x = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 0));
int ptr_y = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 1));
seq = cvGetFileNodeByName(fs, NULL, "rect")->data.seq;
int rect_x = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 0));
int rect_y = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 1));
int rect_width = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 2));
int rect_height = cvReadInt((CvFileNode*)cvGetSeqElem(seq, 3));
CvPoint ptr = cvPoint(ptr_x, ptr_y);
CvRect rect = cvRect(rect_x, rect_y, rect_width, rect_height);
ms->integer = integer;
ms->ptr.x = ptr_x;
ms->ptr.y = ptr_y;
ms->rect.x = rect_x;
ms->rect.y = rect_y;
ms->rect.width = rect_width;
ms->rect.height = rect_height;
}
int main(int argc, char** argv) {
my_struct ms[10] = { { 10, cvPoint(5, 5), cvRect(5, 5, 10, 10) } };
CvFileStorage* sfs = cvOpenFileStorage("E:\\cfg.xml", NULL, CV_STORAGE_WRITE);
write_my_struct(sfs, "struct", ms);
cvReleaseFileStorage(&sfs);
my_struct* ms2 = (my_struct*)malloc(sizeof(my_struct));
CvFileStorage* ofs = cvOpenFileStorage("E:\\cfg.xml", NULL, CV_STORAGE_READ);
read_my_struct(ofs, NULL, ms2);
cvReleaseFileStorage(&ofs);
printf("integer: %d\n", ms2->integer);
printf("ptr: (%d, %d) \n", ms->ptr.x, ms->ptr.y);
printf("rect: (%d, %d, %d, %d) \n", ms->rect.x, ms->rect.y, ms->rect.width, ms->rect.height);
getchar();
return 0;
}
《学习OpenCV》课后习题解答7的更多相关文章
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答
今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...
- 《学习OpenCV》课后习题解答8
题目:(P126) 本章完整讲述了基本的输入/输出编程以及OpenCV的数据结构.下面的练习是基于前面的知识做一些应用,为后面大程序的实现提供帮助. a.创建一个程序实现以下功能:(1)从视频文件中读 ...
- 《学习OpenCV》课后习题解答6
题目:(P104) 使用cvCmp()创建一个掩码.加载一个真实的图像.使用cvsplit()将图像分割成红,绿,蓝三个单通道图像. a.找到并显示绿图. b.克隆这个绿图两次(分别命名为clone1 ...
- 《学习OpenCV》课后习题解答5
题目:(P104) 为一个图像创建多个图像头.读取一个大小至少为100*100的图像.另创建两个图像头并设置它们的origion,depth,nChannels和widthStep属性同之前读取的图像 ...
- 《学习OpenCV》课后习题解答4
题目:(P104) 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组.也就是:外部边界为0,下一个内部边界应该 ...
- 《学习OpenCV》课后习题解答3
题目:(P104) 创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为项点绘制一个绿色平面. 解答: #include "cv. ...
- 《学习OpenCV》课后习题解答2
题目:(P104) 创建一个拥有三个通道的二维字节类型矩阵,大小为100*100,并将所有值赋为0.通过函数cvPtr2D将指针指向中间的通道("绿色").以(20,5)与(40, ...
- 《学习OpenCV》课后习题解答9
题目:(P126) 创建一个程序,使其读入并显示一幅图像.当用户鼠标点击图像时,获取图像对应像素的颜色值(BGR),并在图像上点击鼠标处用文本将颜色值显示出来. 解答: 本题关键是会用cvGet2D获 ...
- 《学习OpenCV》课后习题解答1
题目:(P104) 下面这个练习是帮助掌握矩阵类型.创造一个三通道二维矩阵,字节类型,大小为100*100,并设置所有数值为0. a.在矩阵中使用cvCircle( CvArr* img, CvPoi ...
随机推荐
- element组件dialog关闭时Message消息提示抖动问题
在页面内容较多,出现滚动条时使用element组件里的dialog组件,当关闭dialog组件的同时弹出Message消息提示时,Message会抖动一下. 在页面有滚动条的情况先打开dialog时, ...
- #leetcode刷题之路1-两数之和
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商. 示例 1:输入: ...
- setLocale的一个用处
setLocale是C库中的一个设置地域化信息的C函数. 函数原型为: char *setlocale(int category, const char *locale) 参数解释: category ...
- 关于对连接数据库时出现1130-host “**” is not allowed to connect to this MySql/mariadb server 的错误解决方法
在完成mariadb的搭建后,在端口与防火墙均为正常的情况下,出现了1130- Host xxx is not allowed to connect to this MariaDb server 的情 ...
- mysql 中的存储过程
创建一个简单的存储过程 存储过程proc_adder功能很简单,两个整型输入参数a和b,一个整型输出参数sum,功能就是计算输入参数a和b的结果,赋值给输出参数sum: 几点说明: DELIMITER ...
- git 错误 RPC
remote: Enumerating objects: 3772, done. error: RPC failed; curl 18 transfer closed with outstanding ...
- ASP.NET Web用户控件
用户控件可用来实现页面中可重用的代码,是可以一次编写就多处方便使用的功能块.它们是 ASP.NET控件封装最简单的形式.由于它们最简单,因此创建和使用它们也是最简单的.用户控件实际上是把已有的服务器控 ...
- 【HCNE题型自我考究】
H3CNE题目归结 制定标准 组织: 802.1X协议起源于标准的无线局域网协议802.11.主要目的是为了解决有线局域网用户的接入认证问题. 426.一个包含有华为等多厂商设备的交换网络,其VL ...
- mybatis报错:sql中有条件语句时出现属性没有getter的异常
Mybatis问题:在使用条件语句动态设置SQL语句时出现如下错误 Caused by: org.apache.ibatis.reflection.ReflectionException: There ...
- C语言学习记录_2019.01.29
C语言的灵魂:指针 #include <stdio.h> int main(int argc, char **argv) { printf("Hello, World!\n&q ...