OpenCV—基本数据结构与示例

OpenCV的基本数据结构及示例



OpenCV中强大的Mat类型大家已经比较熟悉了。这里梳理一些在工程中其他经常用到的几种基本数据类型。包括:

         Vec

         Scalar

         Point

         Size

         Rect

         RotatedRect


1. Vec


1.1 基本概念

         Vec是一个模板类,主要用于存储数值向量。


1.2 用法


(1)可用它来定义任意类型的向量

Vec<double, 8> myVector; // 定义一个存放8个double型变量的向量

(2)使用[]访问Vec向量成员         

myVector[0]=0;

 (3)可使用以下预定义的类型

  1. typedef Vec<uchar, 2> Vec2b;
  2. typedef Vec<uchar, 3> Vec3b;
  3. typedef Vec<uchar, 4> Vec4b;
  4. typedef Vec<short, 2> Vec2s;
  5. typedef Vec<short, 3> Vec3s;
  6. typedef Vec<short, 4> Vec4s;
  7. typedef Vec<int, 2> Vec2i;
  8. typedef Vec<int, 3> Vec3i;
  9. typedef Vec<int, 4> Vec4i;
  10. typedef Vec<float, 2> Vec2f;
  11. typedef Vec<float, 3> Vec3f;
  12. typedef Vec<float, 4> Vec4f;
  13. typedef Vec<float, 6> Vec6f;
  14. typedef Vec<double, 2> Vec2d;
  15. typedef Vec<double, 3> Vec3d;
  16. typedef Vec<double, 4> Vec4d;
  17. typedef Vec<double, 6> Vec6d;


(4)Vec支持的运算如下:

  1. v1 = v2 + v3
  2. v1 = v2 - v3
  3. v1 = v2 * scale
  4. v1 = scale * v2
  5. v1 = -v2
  6. v1 += v2
  7. v1 == v2, v1 != v2
  8. norm(v1) (euclidean norm)

1.3 示例代码


(1)向量定义与元素的访问

  1. // Vec
  2. cv::Vec<double, 8> myVector;
  3. for(int i=0; i<myVector.rows;i++)
  4. myVector[i] = i;
  5. cout<<"myVector= "<<myVector<<endl;
  6. cout<<"myVector[0]= "<<myVector[0]<<endl;
  7. cout<<"myVector[3]= "<<myVector[3]<<endl;

运行结果:

(2)基本运算

  1. cv::Vec<int, 6> v1,v2,v3;
  2. for(int i=0; i<v2.rows;i++){ //v2.rows返回向量v2的行数
  3. v2[i] = i;
  4. v3[i] = i+1;
  5. }
  6. v1 = v2 + v3;
  7. cout<<"v2 = "<<v2<<endl;
  8. cout<<"v3 = "<<v3<<endl;
  9. cout<<"v1=v2+v3= "<<v1<<endl;
  10. cout<<"v1=v2*2 = "<<v2*2<<endl;
  11. cout<<"v1=-v2 = "<<-v2<<endl;
  12. cout<<"v1==v2 = "<<(v1==v2)<<endl;
  13. cout<<"v1!=v2 = "<<(v1!=v2)<<endl;
  14. cout<<"norm(v2)= "<<norm(v2)<<endl;

运行结果:


2. Scalar


2.1 基本概念


Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。


2.2 用法


可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。

cv:: Scalar( B, G, R )

2.3 示例代码


(1)cv::Scalar结构

  1. cv::Scalar myScalar;
  2. myScalar = cv::Scalar(0,255,0);
  3. cout<<"myScalar = "<<myScalar<<endl;
  4. system("pause");

 运行结果:


(2)读取彩色图像像素值

彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。

OpenCV存储通道次序为:蓝色、绿色、红色即BGR。
因此,访问彩色像素中元素的方法如下:

  1. cv::Mat pImg = cv::imread("Lena.jpg",1);
  2. if(!pImg.data)
  3. return 0;
  4. int x = 100, y = 100;
  5. cv::Scalar pixel=pImg.at<Vec3b>(x,y);
  6. cout<<"B chanel of pixel is = "<<pixel.val[0]<<endl;
  7. cout<<"G chanel of pixel is = "<<pixel.val[1]<<endl;
  8. cout<<"R chanel of pixel is = "<<pixel.val[2]<<endl;
  9. system("pause");


 运行结果:

3. Point


3.1 基本概念

常用于表示2维坐标(x,y)。

3.2 用法

(1)图像坐标

对图像而言,我们可以这样定义:

  1. cv::Point pt;
  2. pt.x = 10;
  3. pt.y = 8;
或者

cv::Point pt =  Point(10, 8);

或者

cv::Point pt(10,8);

(2)或使用如下预定义:

  1. typedef Point_<int> Point2i;
  2. typedef Point2i Point;
  3. typedef Point_<float> Point2f;
  4. typedef Point_<double> Point2d;

(3)基本运算

  1. pt1 = pt2 + pt3;
  2. pt1 = pt2 - pt3;
  3. pt1 = pt2 * a;
  4. pt1 = a * pt2;
  5. pt1 += pt2;
  6. pt1 -= pt2;
  7. pt1 *= a;
  8. double value = norm(pt); // L2 norm
  9. pt1 == pt2;
  10. pt1 != pt2;


3.3 示例代码


(1)设置坐标点

  1. // Point
  2. cv::Point pt;
  3. pt.x = 278;
  4. pt.y = 269;
  5. //或者
  6. //cv::Point pt (278,269);
  7. cv::Scalar pix = pImg.at<Vec3b>(pt);
  8. cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;

 运行结果:



(2)各类运算

  1. cv::Point pt1(10,20);
  2. cv::Point pt2(2,3);
  3. cout<<"pt1 = "<<pt1<<endl;
  4. cout<<"pt2 = "<<pt2<<endl;
  5. cout<<"pt1+pt2 = "<<pt1+pt2<<endl;
  6. cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;
  7. cout<<"pt1-pt2 = "<<pt1-pt2<<endl;
  8. cout<<"pt2*2 = "<<pt2*2<<endl;

 运行结果:



4. Size


4.1 基本概念

模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height还有一个有用的面积函数area()。

4.2 用法

  1. cv::Size size(int w, int h);
  2. //或者
  3. cv::Size size;
  4. size.width = w;
  5. size.height = h;

4.3 示例代码

  1. // Size
  2. cv::Size size1(6,3);
  3. cv::Size size2;
  4. size2.width = 4;
  5. size2.height = 2;
  6. cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
  7. cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
  8. cout<<"mat1 = "<<endl<<mat1<<endl;
  9. cout<<endl<<"mat2 = "<<endl<<mat2<<endl;
  10. system("pause");

 运行结果:



5. Rect


5.1 基本概念

Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:

  • 矩形左上角坐标: (x,y)
  • 矩形的宽和高: width, height

Rect可以用来定义图像的ROI区域。


5.2 用法

cv::Rect rect(x, y, width, height);


5.3 示例代码

  1. // Rect
  2. cv::Mat pImg = imread("Lena.jpg",1);
  3. cv::Rect rect(180,200,200,200);//(x,y)=(180,200),w=200,height=200
  4. cv::Mat roi = cv::Mat(pImg, rect);
  5. cv::Mat pImgRect = pImg.clone();
  6. cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2);
  7. cv::imshow("original image with rectangle",pImgRect);
  8. cv::imshow("roi",roi);
  9. cv::waitKey();
运行结果:


6. RotatedRect


6.1 基本概念

最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。


6.2 用法

旋转矩形类的构造函数:

RotatedRect(const Point2f& center, const Size2f& size, float angle);

参数:

  • center:中心点坐标Point2f类型
  • size:矩形的宽度和高度,Size2f类型
  • angle:顺时针方向的旋转角度(单位°),float类型


6.3 示例代码

  1. //RotatedRect
  2. cv::Point2f center(100,100);
  3. cv::Size2f size(100,50);
  4. float angle = 45;// try 10, 30, 45
  5. RotatedRect rRect(center, size, angle);
  6. cv::Mat image(200,200,CV_8UC3,cv::Scalar(0));
  7. Point2f vertices[4];
  8. rRect.points(vertices);
  9. for (int i = 0; i < 4; i++)
  10. line(image, vertices[i], vertices[(i+1)%4], Scalar(0,255,0));
  11. Rect brect = rRect.boundingRect();
  12. rectangle(image, brect, Scalar(255,0,0));
  13. imshow("rectangles", image);
  14. waitKey(0);
运行结果:


angle = 10, 30, 45

转载请注明出处(本文更新链接):http://blog.csdn.net/iracer/article/details/51292349

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用var声明的变量 和 直接赋值并未声明的变量的区别

在看JS高级程序设计时忽然想到这个问题&#xff0c;众所周知&#xff0c;直接赋值一个变量而为声明&#xff0c;会产生一个全局变量&#xff08;或者说是全局对象的属性&#xff09;&#xff0c;但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢&#xff0c;这是…

转载-程序员编程技术迅速提高的终极攻略

2019独角兽企业重金招聘Python工程师标准>>> 前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序&#xff1f;走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍&#xff08;朋友的抱怨&#xff1a;学校课程总是从理论出发&#xff0c;作业项目都…

工作记录二-Docker+Dockerfile

1. 安装虚拟机 Oracle VM VirtualBox&#xff0c; 安装centos 7.2版本2. 需要在命令行中先设置代理&#xff1a; export http_proxyproxy.xxxxx.com:8080 3. 运行 yum install docker安装docker 安装 docker-compose curl -L https://github.com/docker/compose/releases/down…

SVM

from&#xff1a;https://blog.csdn.net/liugan528/article/details/79448379 SVM 1. 基本概念 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学…

listView当中有嵌套了有onClickListener的控件时ListView自身的onItemClick无响应的解决方案...

参考:http://www.cnblogs.com/bluestorm/archive/2013/03/24/2979557.html 解决方案 在ListView要显示的Item的外层加上 android:descendantFocusability"blocksDescendants"转载于:https://www.cnblogs.com/jinglecode/p/5683724.html

LoadRunner常用术语

1.场景 2.负载发生器 3.虚拟用户 4.虚拟用户脚本 5.事务 6.思考时间 7.集合点 8.事务响应时间 转载于:https://www.cnblogs.com/Andy-Lv/p/5263707.html

跟我学Shiro目录贴

2019独角兽企业重金招聘Python工程师标准>>> http://jinnianshilongnian.iteye.com/blog/2018398 转载于:https://my.oschina.net/zhanggongming/blog/714844

【WinForm-无边框窗体】实现Panel移动窗体,没有边框的窗体

没有边框的窗体怎么移动&#xff1f;其实方法有很多&#xff0c;下面介绍一种用控件来移动窗体&#xff0c;Panel或PictureBox都可。主要设置控件的MouseDowm和MouseLeave事件。 第一步&#xff1a;窗体设计 窗体最上面是一个panel1 窗体最下面是一个Panel3&#xff0c;只显示最…

\Grokking Algorithms\简介与作者采访

\关键点\这本书目的是告诉读者解决问题的新方法。 \这本书试图通过插图来让大家更容易掌握主题&#xff0c;避免部分读者觉得太费解。 \这本书不仅适合没有接触过算法的人&#xff0c;也适合刚从计算机专业毕业的学生。 \这本书提供了非常多的例子和简单练习。 \这并不是一本参…

ZedGraph使用经验

开源的统计图控件中基本常用的是OpenFlashChar和ZedGraph&#xff0c;今天就先来讲讲ZedGraph的使用。 ZedGraph资源 ZedGraph来源&#xff1a;http://sourceforge.net/project/showfiles.php?group_id114675ZedGraph相关例子资源&#xff1a;http://zedgraph.org/wiki/index.…

[转载]聊一聊人员培养

转载自“搜狗测试”微信。 人员培养的痛点 大家在组内人员培养是否遇到了如下问题&#xff1a; 组员成长缓慢&#xff0c;无法达到预期 有时候感觉组员没啥进步&#xff0c;有时候感觉组员挺好的&#xff0c;无法统一评价 脑子里都是组员的问题&#xff0c;无法集中精力做其他…

QCon2016旧金山大会焦点分享者确认

QCon旧金山大会是由InfoQ举办的连续十年的最大的英语会议&#xff0c;它将在今年11月7-9日在旧金山湾区举行。\\在QCon大会涵盖了一系列深入的技术&#xff0c;架构师、资深开发者所关注的国际事件&#xff0c;聚焦创新领域和软件发展趋势&#xff0c;QCon大会每年在美国、中国…

怎样安装两个tomcat,怎样配置

装两个tomcat 各自是6.0和7.0 可想执行tomcat6.0 可是实际上却执行tomcat7.0 两个版本号都是用解压缩包 事实上就是不能执行tomcat6.0 仅仅能执行7.0 两个环境变量都配置了。port也改了 还是不行 我遇到这样的情况了&#xff0c;不知大家遇到没有&#xff0c;例如以下是我的…

机器学习实战之SVM

一引言&#xff1a;支持向量机这部分确实很多&#xff0c;想要真正的去理解它&#xff0c;不仅仅知道理论&#xff0c;还要进行相关的代码编写和测试&#xff0c;二者想和结合&#xff0c;才能更好的帮助我们理解SVM这一非常优秀的分类算法支持向量机是一种二类分类算法&#x…

模拟分页效果

css部分&#xff1a; <style type"text/css">.main{width:800px;zoom:1;margin:0 auto;}.item{width:800px;overflow:hidden;}ul{padding:0;width:860px;zoom:1;}.clear{zoom:1;}.clear:after{content:"";display:block;height:0;clear:both;visibil…

XML基本概念及增删改查操作

一、概念及特征&#xff1a; 1. XML 指可扩展标记语言(Extensible Markup Language)&#xff0c;用户可以自己定义标签。XML 被设计用来传输和存储数据&#xff0c;而 HTML 用于格式化并显示数据&#xff0c;并且HTML不能自定义标签。 2. XML 文档形成一种树结构&#xff0c; X…

mysql 时间类型 datetime,timestamp

2019独角兽企业重金招聘Python工程师标准>>> CURRENT_TIMESTAMP 的 timestamp 意思是 根据 mysql 的当前时间&#xff0c;使用mysql 的当前时间。 参考地址&#xff1a;http://blog.sina.com.cn/s/blog_67cc6e7d0100nrwk.html datetime 和 timestamp 都是保存时间格…

生成jsp验证码的代码详解(servlet版)

package util; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; import javax.servlet.*; import javax.servlet.http.*; import com.sun.image.codec.jpeg.*; /** 生成验证码图片*/ public class ValidateCode exten…

机器学习中的交叉验证(cross-validation)

from:https://blog.csdn.net/lhx878619717/article/details/49079785 交叉验证&#xff08;Cross validation)&#xff0c;交叉验证用于防止模型过于复杂而引起的过拟合. 有时亦称循环估计&#xff0c; 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子…

linux禁止ping

执行此命令 &#xff1a;echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 可以禁止ping一、如果没有iptables禁止pingecho 1 > /proc/sys/net/ipv4/icmp_echo_igore_all #开启echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all #关闭二、利用iptables规则禁pingi…