文档章节

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

NoMasp
 NoMasp
发布于 2015/09/08 21:45
字数 1325
阅读 21
收藏 0


实例一
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);

版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/43602331

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
加载中

评论(0)

元旦赠书 | 18本纸质书:OpenCV、Python和机器学习,总有一本适合你

【本文首发于公众号【CVPy】。以下赠书活动需要在公众号中参与。文章末尾扫码关注。】 送福利 圣诞的时候送的三本书已经发出,而且其中的两人已经收到,路途较远的那个还在路上。当时主页君原...

冰不语
昨天
0
0
opencv学习 --- FileStorage类使用注意事项

FileStorage类是OpenCV中用来进行文件操作的封装类,可以对XML,YAML,txt甚至doc文件进行读写操作。在使用opencv时经常需要对特征数据等进行保存,这时候通常会选择XML文件或者YAML文件。xml...

hairuiJY
昨天
0
0
对比《OpenCV计算机视觉编程攻略第3版》《OpenCV 3计算机视觉Python语言实现第2版》PDF代码...

OpenCV 3是一种先进的计算机视觉库,可以用于各种图像和视频处理操作,通过OpenCV 3 能很容易地实现一些有前景且功能先进的应用(比如:人脸识别或目标跟踪等)。从图像处理的基本操作出发,...

瘋耔
昨天
0
0
有哪些学习openCV的网站或书籍?

作者:采石工 链接:https://www.zhihu.com/question/20822510/answer/45691624 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 下面是我的整理: 网站:...

瘋耔
昨天
0
0
Python计算机视觉:第十章 OpenCV

第十章 OpenCV import cv2 # 读入图像im = cv2.imread('../data/empire.jpg') # 打印图像尺寸h, w = im.shape[:2]print h, w # 保存原jpg格式的图像为png格式图像cv2.imwrite('../images/ch......

GarfieldEr007
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis+lua 实现分布式令牌桶,高并发限流

方案一、在提供给业务方的Controller层进行控制。 1、使用guava提供工具库里的RateLimiter类(内部采用令牌捅算法实现)进行限流 2、使用Java自带delayqueue的延迟队列实现(编码过程相对麻烦,...

stys35
27分钟前
15
0
socket编程之websocket实现

主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket。 websocket是一种可以双向通讯的长连接协议,http是获取完数据就关闭,websocket则可以...

php开源社区
34分钟前
28
0
这款Mac视频下载神器,轻松解决1000多个视频网站下载难题!

Mac视频下载工具哪款好用?号称Mac届经典的网页视频下载神器,支持 1000 多个流媒体网站的视频下载,包括YouTube,优酷,Bilibili,Vimeo等,,让你轻松解决视频下载难题! Downie 4 Mac版值...

mac小叮当
36分钟前
22
0
基于三维GIS技术的矢量地图动态LOD渲染方法

本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染。研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数...

ZTMAP
39分钟前
27
0
Docker安装MySQL&Redis

Docker安装MySQL 下载 mysql 镜像 docker pull mysql:5.7 启动容器 docker run -p 3306:3306 --name mysql \-v /mydata/mysql/log:/var/log/mysql \-v /mydata/mysql/data:/var/lib/mysq......

农夫三拳有点疼-_-
39分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部