[OpenCV]3 在实例中学习简单函数以及数据读写

实例一
int main()
{
 IplImage*  img = cvLoadImage("6085.jpg", 1);

IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1);
 IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1);
 IplImage* blue = cvCreateImage(cvGetSize(img), img->depth, 1);

cvSplit(img, blue, green, red, NULL);

IplImage* img1 = cvCloneImage(green);
 IplImage* img2 = cvCloneImage(green);

double dMaxValue, dMinValue;
 cvMinMaxLoc(green, &dMinValue, &dMaxValue, NULL, NULL, NULL);
 printf("Max: %f\tMin: %f\n", dMaxValue, dMinValue);

unsigned char thresh = (dMaxValue - dMinValue) / 2;
 cvSet(img1, cvScalarAll(thresh), 0);
 cvSet(img2, cvScalarAll(0), 0);

cvCmp(green, img1, img2, CV_CMP_GE);
  
 cvSubS(green, cvScalarAll(thresh/2), green, img2);

cvShowImage("Clone1", img1);
 cvShowImage("Clone2", img2);

cvShowImage("Red", red);
 cvShowImage("Green", green);
 cvShowImage("Blue", blue);

cvWaitKey(0);
 return 0;
}
cvSplit()函数可以分别复制每个通道到多个单通道图像,当然,cvSplit()函数还可以复制src的各个通道到图像dst0,dst1,dst2和dst3中。注意,目标tuxiang必须和源图像在大小和数据类型上均匹配,当然,也应该是单通道的图像。如果源图像少于4个通道,这样的话传递给cvSplit()的不必要的目标参数可以设置成NULL。
void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3);

cvSet()函数能将数组的所有通道的所有值设置为指定的参数value。该cvSet()函数接受一个可选的参数,如果提供参数,那么只有那些参数mask中非0值对应的像素将被设置为指定的值。另外有cvSetZero()函数,相当于cvSet(0,0)。
void cvSet(CvArr* arr, CvScalar* value, const CvArr* mask = NULL);

void cvMinMaxLoc(const CvArr* arr, double* min_val, double* max_val, CvPoint* min_loc = NULL, CvPoint* max_loc = NULL, const CvArr* mask = NULL);该函数用于找出数组中的最大值和最小值,并且还可以返回它们的地址。计算出的最大值和最小值赋值给max_val和min_val。如果极值的位置参数非空,那极值的位置便会写入min_loc和max_loc。如果参数mask非空,那么只有arr中与参数mask中的非零的像素相对应的部分才被考虑。cvMinMaxLoc()仅仅处理单通道数组,如果有一个多通道的数组,则应该使用cvSetCOI()来对某个特定通道进行设置。cvSetCOI()函数在下文有相关介绍。
cvCmp和cvCmpS两个函数都是进行对比操作,比较两幅图像对应的像素值或将给定图像的像素值与某常标量值进行比较。cvCmp()和cvCmpS()的最后一个参数和比较操作符可以是以下的任意一个。
CV_CMP_EQ    (src1i == src2i)
CV_CMP_GT    (src1i > src2i)
CV_CMP_GE    (src1i >= src2i)
CV_CMP_LT    (src1i < src2i)
CV_CMP_LE    (src1i <= src2i)
CV_CMP_NE    (src1i != src2i)

实例二

int main()
{
 IplImage* img = cvLoadImage("6085.jpg");
 int x = 400, y = 400;
 int width = 150, height = 150;

int add =180;
 cvSetImageROI(img, cvRect(x, y, width, height));

cvAddS(img, cvScalar(add), img);
 cvResetImageROI(img);
 cvShowImage("Image", img);
 cvWaitKey(0);
 return 0;
}

void cvAddS(const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask = NULL);
void cvAdd(const CvArr* src1, const CvArr* src2,CvArr* dst, const CvArr* mask = NULL);
这两个函数都都比较简单在此不再介绍,下面我们来看看cvAddWeighted()函数。
void cvAddWeighted(const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst);
在这里包含着一个计算公式:
dst(x,y)=alpha*src1(x,y)+beta*src2(x,y)+gamma
结果图像dst和src1、src2必须是同样的像素类型,也些图像的尺寸不要求相同,但ROI必须统一尺寸。

cvSetImageROI
void cvSetImageROI(IplImage* image, CvRect rect);
void cvResetImageROI(IplImage* image);
通过cvResetImageROI()函数释放ROI是非常重要的,否则,最终只会显示你所设置的感兴趣的部分,而不是整个图像。

实例三

int main()
{
 IplImage* src = cvLoadImage("8479.jpg",1);

IplImage* img = cvCreateImageHeader(cvSize(200, 600),
  src->depth, src->nChannels);
 IplImage* img2 = cvCreateImageHeader(cvSize(200, 600),
  src->depth, src->nChannels);

img->imageData = (char*)cvPtr2D(src, 100, 400);
 img2->imageData = (char*)cvPtr2D(src, 400, 400);

cvNot(img2, img2);
 cvNot(img, img);

cvShowImage("Src", src);
 cvWaitKey(0);
 return 0;
}
cvCreateMat()
CvMat* cvCreateMat(int rows, int cols, int type);
CvMat* cvCreateMatHeader(int rows, int cols, int type);
CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data = NULL, int step = CV_AUTOSTEP);
CvMat cvMat(int rows, int cols, int type, void* data = NULL);
CvMat* cvCloneMat(const cvMat* mat);
void cvReleaseMat(CvMat** mat);
而以下示例中要用的cvCreateImageHeader和cvCreateMatHeader类似,大家应该能够举一反三。
cvNot()函数会将src中的每一个元素都取反,然后把结果赋值给dst。

实例四

int main()
{
 CvMat* mat = cvCreateMat(400, 400, CV_8UC3);

for (int i = 0; i < mat->cols; i++)
 {
  for (int j = 0; j < mat->rows; j++)
  {
   cvSet2D(mat, i, j, cvScalarAll(0));
  }
 }

cvCircle(mat, cvPoint(400 / 2, 400 / 2), 400 / 4, cvScalar(255, 255, 0), 3, 8, 0);
 cvShowImage("image", mat);
 cvWaitKey(0);
 return 0;
}
cvCircle()函数可以用来画圆,而cvEllipse()函数则用来绘制椭圆,但后者更加复杂。
void cvEllipse(CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness = 1, int line_type = 8);其中angle是指偏离主轴的角度,从X轴开始算,逆时针方向为正。后两个则是表示弧线开始和结束位置的角度。例如,一个完整的椭圆这里就分别为0和360。
cvScale()是cvConvertScale()的一个宏,它会将shift设置为0.0。

实例五

OpenCV还支持序列化和去序列化各种数据类型(英文名分别:serialize, de-serialize),可以从磁盘中读/写YAML和XML数据。cvLoadImage()函数在前面我们已经见过了,而cvSaveImage()也是类似的。
以下是一个往磁盘中写入一个XAML文件的示例。

CvFileStorage* fs = cvOpenFileStorage(“opencv.xml”,0,CV_STORAGE_WRITE);
cvWriteInt(fs,”width”,100);
cvStartWriteStruct(fs,”height”,CV_NODE_SEQ);
cvWriteInt(fs,0,300);
cvEndWriteStruct(fs);
cvReleaseFileStorage(&fs);

时间: 2025-01-10 10:27:31

[OpenCV]3 在实例中学习简单函数以及数据读写的相关文章

【OpenCV归纳】3 在实例中学习简单函数以及数据读写

 实例一 int main() { IplImage*  img = cvLoadImage("6085.jpg", 1); IplImage* red = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* green = cvCreateImage(cvGetSize(img), img->depth, 1); IplImage* blue = cvCreateImage(cvGetSize(img), i

【 python 学习笔记 -- OOP】在实例中学习继承(inheritance)和组合(composition)

[面向对象的三大特征]: [封装(encapsulation)]: 通过抽象的类把数据和方法封装起来.实例的数据只能通过public interface(即实例的方法)来获取或操作. [优点]:1. 功能只需在一个地方定义,而不需要在很多地方重复定义 2. 保证对象内部的数据的安全性 3. 当我们想要使用一个方法的时候,我们只需要知道我们用这个方法会返回什么结果,而不需要知道内部到底做了哪些操作来实现的.  就好像我们看电视时想要换频道,只需要按几个按钮,不需要知道要怎么调频. [继承  (in

从实例中学习grid布局

对于Web开发者来说,网页布局一直是个比较重要的问题. Web 布局主要经历了以下四个阶段: 1.table表格布局: 2.float浮动及position定位布局: 3.flex弹性盒模型布局,革命性的突破,解决传统布局方案上的三大痛点 "排列方向"."对齐方式","自适应尺寸".是目前最为成熟和强大的布局方案: 4.grid栅格布局,二维布局模块,具有强大的内容尺寸和定位能力,适合需要在两个维度上对齐内容的布局.随着 CSS Grid 的出现

ceph学习笔记之六 数据读写过程

数据写过程 1.Client向PG所在的主OSD发送写请求. 2.主OSD接收到写请求,同时向两个从OSD发送写副本的请求,并同时写入主OSD的本地存储中. 3.主OSD接收到两个从OSD发送写成功的ACK应答,同时确认自己写成功,就向客户端返回写成功的ACK应答. 4.在写操作的过程中,主OSD必须等待所有的从OSD返回正确应答,才能向客户端返回写操作成功的应答     数据读 1.客户端应用发起读请求事件,RADOS将这个请求发送给主OSD. 2.主OSD从本地磁盘读取数据完成读请求并返回给

贝叶斯网(2)Netica:从数据中学习CPT

1. 离散节点 在官方Tutorial中是有详细的案例的,就是B篇3.3节,你可以动手把天气预报这个实现一下: http://www.norsys.com/tutorials/netica/secB/tut_B3.htm#LearningProbTables 2. 连续节点 假如我想输入的不是离散的状态,而是连续的数值,则不能像上一个案例一样做了. *  离散状态:难,易:阴,晴,雨:是,否--这些都是多选一问题,天气只能是"阴,晴,雨"三选一,课程难度只有"难,易"

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等.实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些.既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例. 续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复.下面着重加入AOP实现DAO层动态分库调用.可先看上篇文章<spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例 >

OpenCV图像编程实例系列-图像文件批量读取

本博文摘录<OpenCV图像处理编程实例>2.4章节,更详细的内容请参考本书.图书购买地址: 当当:http://product.dangdang.com/23956649.html 京东:http://item.jd.com/11929148.html 2.4.6 图像批量读取——规则 在进行图片序列处理时,我们常常需要读取文件夹下的每一个图片,然后再进行分析处理,因此需要对文件名连续及无规则情况分开讨论.对于文件名连续的情况,文件读取就简单得多,可以利用sprintf函数实现在窗口中连续读

python学习_处理数据编程实例(一)

目的:用一个实例总结学习到的with语句,函数,列表推导,集合,排序,字符分割等内容 要求:分别以james,julie,mikey,sarah四个学生的名字建立文本文件,分别存储各自的成绩,时间格式都精确为分秒,时间越短成绩越好,分别输出每个学生的无重复的前三个最好成绩,且分秒的分隔符要统一为"." 数据准备:分别建立四个文本文件 james.txt     2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22 julie.txt        2

从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)

一.前言 这篇文章是学习单例模式的第二篇,之前的文章一下子就给出来看起来很高大上的实现方法,但是这种模式还是存在漏洞的,具体有什么问题,大家可以停顿一会儿,思考一下.好了,不卖关子了,下面我们来看看每种单例模式存在的问题以及解决办法. 二.每种Singleton 模式的演进 模式一 public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton() { }