Opencv第三章
2. 下面这个练习是帮助掌握矩阵类型。创造一个三通道二维矩阵,字节类型,大小为100×100,并设置所有数值为0。
a. 在矩阵中使用void cvCircle(CvArr* img, CvPoint center, intradius, CvScalar color, int thickness=1, int line_type=8, int shift=0)画一个圆。
b. 使用第2章所学的方法来显示这幅图像。
#include <cv.h>
#include <highgui.h>
int main()
{
CvMat *mat = cvCreateMat(, , CV_32FC3);
cvZero(mat); CvSize rect = cvSize(, );
IplImage* image = cvCreateImage(rect, IPL_DEPTH_8U, 3); CvPoint center = cvPoint(, );
int radius = ;
CvScalar color = cvScalar(, , );
cvCircle(image,center, radius, color, , , ); cvNamedWindow("main", );
//cvNamedWindow("main1", 1);
cvShowImage("mian", image);
//cvShowImage("main1", mat);
cvWaitKey();
cvReleaseImage(&image);
cvReleaseMat(&mat);
return ; }
3. 创建一个拥有三个通道的二维字节类型矩阵,大小为100x100,并将所有值赋为0。通过函数cvPtr2D 将指针指向中间的通道(“绿色”)。以(20,5)与(40,20)为顶点间画一个绿色的长方形。
#include <cv.h>
#include <highgui.h>
int main()
{
CvSize size = cvSize(, );
IplImage *image = cvCreateImage(size, IPL_DEPTH_8U, );
cvZero(image);
int left = ;
int right = ;
int top = ;
int bottom = ;
for (; top < bottom; top++)
{
for (; left < right; left++)
{
*(cvPtr2D(image, top, left)+) = ;
//cvPtr2D 参数分别表示在当前的图中,坐标为(top,left)的位置 + 1 为绿色 ;+2 表示红色 ;+0 表示蓝色;
}
left = ;
}
cvNamedWindow("main", );
cvShowImage("main", image);
cvWaitKey();
cvReleaseImage(&image);
cvDestroyWindow("main");
return ;
}
4.创建一个大小为100x100的三通道RGB图像。将它的元素全部置0.使用指针算法以(20,5 )与(40,20)为顶点绘制一个绿色平面。
#include <cv.h>
#include <highgui.h>
int main()
{
CvSize size = cvSize(, );
IplImage *img = cvCreateImage(size, IPL_DEPTH_8U, );
cvZero(img);
int left = ;
int right = ;
int top = ;
int bottom = ;
for (int i = ; i < img->height;i++)
{
uchar *ptr = (uchar*)(img->imageData + i*img->widthStep);
//imageData 图像数据的指针
//widthStep 校准后的行字节数
for (int j = ; j < img->width; j++)
{
ptr[j * ] = ;
ptr[j * + ] = ;
ptr[j * + ] = ;
}
}
for (; top < bottom; top++)
{
uchar *ptr = (uchar*)(img->imageData + top * img->widthStep);
for (; left < right; left++)
{
ptr[left * ] = ;
ptr[left * + ] = ;
ptr[left * + ] = ;
}
left = ;
}
cvNamedWindow("main", );
cvShowImage("main", img);
cvWaitKey();
cvReleaseImage(&img);
cvDestroyWindow("main");
return ;
}
4.
创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组。也就是,外部边界为0,下一个内部边界为20,再下一个内部边界为20,
再下一个内部边界为40,以此类推,直到最后内部值为200,所有的边界应该为10像素的宽度。最后显示这个图形。
#include <cv.h>
#include <highgui.h>
int main()
{
CvSize size = cvSize(, );
IplImage *img = cvCreateImage(size, IPL_DEPTH_8U, );
cvZero(img);
for (int i = ; i <= ; i++)
{
cvSetImageROI(img, cvRect(-i*, +i*, +i*, ));
cvAddS(img, cvScalar(), img);
}
/*
cvSetImageROI(img, cvRect(100, 0, 10, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(95, 10, 20, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(90, 20, 30, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(85, 30, 40, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(80, 40, 50, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(75, 50, 60, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(70, 60, 70, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(65, 70, 80, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(60, 80, 90, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(55, 90, 100, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(50, 100, 110, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(45, 110, 120, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(40, 120, 130, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(35, 130, 140, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(30, 140, 150, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(25, 150, 160, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(20, 160, 170, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(15, 170, 180, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(10, 180, 190, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(5, 190, 200, 10));
cvAddS(img, cvScalar(255), img);
cvSetImageROI(img, cvRect(0, 200, 210, 10));
cvAddS(img, cvScalar(255), img);
*/
cvResetImageROI(img);
cvNamedWindow("mian", );
cvShowImage("main", img);
cvWaitKey();
cvReleaseImage(&img);
cvDestroyWindow("main");
return ;
}
6.为一个图像创建多个图像头。读取一个大小至少为100x100的图像。另外创建两个图像头并设置他们的origion,depth,nChannels和widthStep属性同之前读取的图像一致,
在新的图像头中,设置宽度为20,高度为30。最后将imageData指针分别指向像素(5,10)和(50,60)像素位置,传递这两个新的图像头给cvNot。最后显示最初读取的图像,在那个大的图像中有应该有两个矩阵,矩阵内的值是原始值得求反值。
#include <cv.h>
#include <highgui.h>
int main()
{
IplImage *img = cvLoadImage("001.jpg",);
IplImage *src1 = cvCreateImageHeader(cvSize(,), img->depth, img->nChannels);
IplImage *src2 = cvCreateImageHeader(cvSize(2,3), img->depth, img->nChannels);
src1->origin = img->origin;
src2->origin = img->origin;
src1->widthStep = img->widthStep;
src2->widthStep = img->widthStep;
uchar* tmp1;
uchar* tmp2;
src1->imageData = img->imageData + * img->widthStep + * img->nChannels;
src2->imageData = img->imageData + * img->widthStep + * img->nChannels;
//cvAddS(src1, cvScalar(0), src1);
//cvAddS(src2, cvScalar(0), src2);
cvNot(src1, src1);
cvNot(src2, src2); cvReleaseImageHeader(&src1);
cvReleaseImageHeader(&src2);
//cvNot(img, img);
cvNamedWindow("main", );
cvShowImage("main", img);
cvWaitKey();
cvReleaseImage(&img);
cvDestroyWindow("main");
return ;
}
使用cvCmp()创建一个掩码。加载一个真实的图像。使用cvSplit()将图像分割成红、绿、蓝三个通道图像。
a.找到并显示绿图
b.克隆这个绿图(分别命名为clone1和clone2)
c.求出这个绿色平面的最大值和最小值
d.将clone1的所有元素赋值为thresh=(unsigned char)((最大值-最小值)/2.0)
e.将clone1所有元素赋值为0,调用函数cvCmp(green_image,clone1,clone2,CV_CMP_GE)
f.最后,使用cvSubs(green_image,thresh/2,green_image,clone2)函数并显示结果
#include <cv.h>
#include <highgui.h>
int main()
{
IplImage *img = cvLoadImage("3.jpg", );
cvNamedWindow("img", );
cvShowImage("img", img);
IplImage *test,*img1,*G_img,*R_img,*B_img;
test = cvCreateImage(cvSize(img->width, img->height), img->depth, );
img1 = cvCreateImage(cvSize(img->width, img->height), img->depth, ); G_img = cvCreateImage(cvSize(img->width, img->height), img->depth, );
R_img = cvCreateImage(cvSize(img->width, img->height), img->depth, );
B_img = cvCreateImage(cvSize(img->width, img->height), img->depth, );
cvSplit(img, test, , , ); CvScalar scalar;
for (int i = ; i < img->nChannels; i++)
{
scalar.val[] = 0x1;
}
for (int i = ; i < img->height; i++)
{
for (int j = ; j < img->width; j++)
{
cvSet2D(img1, i, j, scalar);
}
}
cvMerge(img1, test, img1, , G_img);
cvMerge(img1, img1, test, , R_img);
cvMerge(test, img1, img1, , B_img);
cvNamedWindow("GREEN", );
cvShowImage("GREEN", G_img); //显示绿图
cvNamedWindow("RED", );
cvShowImage("RED", R_img);
cvNamedWindow("BLUE", );
cvShowImage("BLUE", B_img); IplImage *clone1, *clone2;
clone1 = cvCloneImage(test);
clone2 = cvCloneImage(test);
double mmax, mmin;
cvMinMaxLoc(test, &mmin, &mmax);//找出最大值和最小值
printf("mmin = %d,mmax = %d\n", mmin, mmax);
double thresh = (mmax - mmin) / ;
cvSet(clone1, cvScalar(thresh));//将clone1 的所有元素赋值thresh
cvZero(clone2); //将clone1 的所有元素赋值0
cvCmp(test, clone1, clone2, CV_CMP_GE);
cvNamedWindow("clone2", );
cvShowImage("clone2", clone2);
cvSubS(test, cvScalar(thresh / ), test, clone2);
cvNamedWindow("test", );
cvShowImage("test", test);
cvWaitKey();
cvReleaseImage(&img);
cvReleaseImage(&test);
cvReleaseImage(&img1);
cvReleaseImage(&G_img);
cvReleaseImage(&clone1);
cvReleaseImage(&clone2);
cvDestroyAllWindows();
return ;
}
Opencv第三章的更多相关文章
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- Python黑帽编程3.0 第三章 网络接口层攻击基础知识
3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
- 《python核心编》程课后习题——第三章
核心编程课后习题——第三章 3-1 由于Python是动态的,解释性的语言,对象的类型和内存都是运行时确定的,所以无需再使用之前对变量名和变量类型进行申明 3-2原因同上,Python的类型检查是在运 ...
- 精通Web Analytics 2.0 (5) 第三章:点击流分析的奇妙世界:指标
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第三章:点击流分析的奇妙世界:指标 新的Web Analytics 2.0心态:搞定它.新的闪亮系列工具:是的.准备好了吗?当然 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- Java语言程序设计(基础篇) 第三章 选择
第三章 选择 3.8 计算身体质量指数 package com.chapter3; import java.util.Scanner; public class ComputeAndInterpret ...
随机推荐
- C++STL——vector
一.相关定义 vector 数组 随机访问迭代器 快速随机访问元素 尾部进行快速随机地插入和删除操作 特征: 能够存放任意类型: 访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内 ...
- winform timer时间间隔小于执行时间
如果SetTimer的时间间隔为t,其响应事件OnTimer代码执行一遍的时间为T,且T>t.这样,一次未执行完毕,下一次定时到,这时候程序会如何执行? 可能的情况:1.丢弃还未执行的代码,开始 ...
- C++结构体排序
在C++中,对结构体的排序方式比C语言丰富的多.在C语言中,我们主要是通过qsort进行排序操作(抛开手写排序算法不说). 在C++<algorithm>中,有一个十分强大的排序函数sor ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...
- JVM内存区域配置
堆内存:新域+旧域 设置堆内存初始化大小 java -Xms128m 设置堆内存初始化大小128MB 设置堆内存最大大小 java -Xmx256m 设置堆内存最大256MB 通常将堆内存的初始化大小 ...
- BZOJ4318 OSU!(动态规划+概率期望)
设f[i][0/1]为考虑前i位,第i位为0/1时的期望得分(乘以是0/1的概率).暴力转移显然.前缀和优化即可. 但是这个前缀和精度无法承受,动不动就nan. 考虑增加一位的贡献.若之前后缀1的个数 ...
- hdu 1267 下沙的沙子有几粒? (递推)
下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- [BZOJ4920][Lydsy六月月赛]薄饼切割
[BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...
- 处理WebService asmx的经验
项目的需求,需要和一个.net系统进行数据交换,合作方提供了一个WebService接口.这个与一般的PHP POST或GET传值再查库拿数据的思路有点不一样,需要用到SOAP模块,处理方法也很简单, ...
- springboot搭建web项目(转)
转:http://blog.csdn.net/linzhiqiang0316/article/details/52589789 这几天一直在研究IDEA上面怎么搭建一个web-mvc的SpringBo ...