讨论一下大家都用opencv好找工作吗做哪些方面的研究工作

17366人阅读
opencv(24)
最近在写自己的算法,其实就是对一些传统算法的改进。传统算法可以参考opecv的源代码。在阅读源代码的过程中,我慢慢领会到了opencv的强大之处,并不是因为它实现了各种算法,而是在于它对于基本数据结构的设计,是得其他人可以很方便的使用这些数据结构来实现自己的算法。在帮助手册中,已经对于这些数据结构有比较详细的描述了。今天我就为英语不好的孩子们服务一下,简单的介绍一下它们。
首先介绍2维点对Point_,它的是一个模板类。我们可以直接访问数据成员x,y。它不仅定了+、-、==、!=这4个基本的操作,还定义了点乘、叉乘等操作。特别的这个类还提供了inside函数来判断一个点是否在矩形区域内。此外,还定义了一些其他的类型转化函数,比如转化为1.X版本的CvPoint。
为了方便使用,opencv又对常用的类型进行了定义:
typedef Point_&int& Point2i;
typedef Point2i P
typedef Point_&float& Point2f;
typedef Point_&double& Point2d;
同理还有Point3_,只不过它是一个3维点(x,y,z)而已。它的常用类型是:
typedef Point3_&int& Point3i;
typedef Point3_&float& Point3f;
typedef Point3_&double& Point3d;
介绍完点,就可以介绍Size_了。它也是模板类。
typedef Size_&int& Size2i;
typedef Size2i S
typedef Size_&float& Size2f
Size能够访问的成员变量是height和width。还定义了area函数来求面积。其他的操作基本都是类型转化函数。
下来介绍Rect_模版类。它是由左上角点和长度、宽度定义的。在opecv中,一般定义为左开右闭区间。有意思的是,这个类竟然也提供了一个Rect+Point的函数,作用是对矩形的偏移,还有一个Rect + Size的函数,在左上角不变的情况下,重新调整矩形的大小。其他的操作还有与&和|,是求两个矩形的交集和并集。
除了基本的矩形之外,opecv还提供了一个可以旋转的矩形RotatedRect,它是由中心、变长、旋转角度决定的。你可以访问它的这三个成员,也可以使用points函数返回它的4个顶点,使用boundingRect求出它的外接矩形(非旋转),下面是一个例子:
int main(void)
Mat bg(200,200,CV_8UC3,Scalar(0));
imshow(&&,bg);
RotatedRect rRect(Point2f(100,100),Size(100,100),40);
Point2f vertices[4];
rRect.points(vertices);
for(int i = 0; i & 4;++i)
line(bg,vertices[i],vertices[(i+1)%4],Scalar(0,255,0));
Rect brect = rRect.boundingRect();
rectangle(bg,brect,Scalar(255,0,0));
imshow(&&,bg);
waitKey();
下面介绍Matx类,这也是一个模板类,用来记录一些小的矩形。这些矩形在编译前大小就固定了:
typedef Matx&float, 1, 2& Matx12f;
typedef Matx&double, 1, 2& Matx12d;
typedef Matx&float, 1, 6& Matx16f;
typedef Matx&double, 1, 6& Matx16d;
typedef Matx&float, 2, 1& Matx21f;
typedef Matx&double, 2, 1& Matx21d;
typedef Matx&float, 6, 1& Matx61f;
typedef Matx&double, 6, 1& Matx61d;
typedef Matx&float, 2, 2& Matx22f;
typedef Matx&double, 2, 2& Matx22d;
typedef Matx&float, 6, 6& Matx66f;
typedef Matx&double, 6, 6& Matx66d;
如果要使用灵活的矩形,还是用Mat吧。
下面介绍Vec类,它其实是元素较少的向量。
typedef Vec&uchar, 2& Vec2b;
typedef Vec&uchar, 3& Vec3b;
typedef Vec&uchar, 4& Vec4b;
typedef Vec&short, 2& Vec2s;
typedef Vec&short, 3& Vec3s;
typedef Vec&short, 4& Vec4s;
typedef Vec&int, 2& Vec2i;
typedef Vec&int, 3& Vec3i;
typedef Vec&int, 4& Vec4i;
typedef Vec&float, 2& Vec2f;
typedef Vec&float, 3& Vec3f;
typedef Vec&float, 4& Vec4f;
typedef Vec&float, 6& Vec6f;
typedef Vec&double, 2& Vec2d;
typedef Vec&double, 3& Vec3d;
typedef Vec&double, 4& Vec4d;
typedef Vec&double, 6& Vec6d;
它支持加、减、数乘、相等、不等、求范数等运算。
Scalar_类其实是用Vec&tp,4&派生下来的,也就是说,它是一个4元组:typedef Scalar_&double& S
他通常用来传递像素。
Range类用来指定连续的子序列。比如矩阵的一部分,比较简单,我们直接看定义:
class CV_EXPORTS Range
Range(int _start, int _end);
Range(const CvSlice& slice);
int size()
bool empty()
static Range all();
operator CvSlice()
int start,
讲完这些简单的类型之后,我们看一个非常重要的类型;Mat。Mat是opencv中的一种非常重要的数据结构,当刚开始使用时,我仅仅把它当做一个储存图像的数据结构,后来才慢慢理解,它不仅可以储存二维矩阵,也可以储存高维矩阵,这在模式识别、机器学习中是非常常用的。对于这类问题,我们就没有必要自己手动分配内存了,直接使用它们就可以了。这个类的内容很多,但opencv的帮助手册,很好的帮我们理清的其中的内容。
其中的核心数据成员data的储存方式在前一篇博客《我的OpenCV学习笔记(23):Mat中实际数据是如何保存的》中已经讨论过了,这里只做一个补充,就是多维情况:
int main(void)
int sz[]={4,5,6};
Mat img(3,sz,CV_8U);//3维数组
cout&&img.dims&&
cout&&img.size[0]&&
cout&&img.size[1]&&
cout&&img.size[2]&&
cout&&img.step[0]&&
cout&&img.step[1]&&
cout&&img.step[2]&&
//遍历每个元素
for(int i = 0; i & 4;++i)
for(int j = 0; j & 5;++j)
for(int k = 0; k & 6;++k)
cout&&(int)*(B.data + B.step[0]*i + B.step[1]*j + B.step[2]*k)&&
}我们建立了一个3维数组,数组的每一维长度分别为4,5,6。这可以通过size来获得。由于每个第一维向量中包含5个第二维的数组,而每个第二维数组中又包含了6个第三维数组,所以第一维每增加一步,相当于整个地址移动了5*6.所以step[0],等于30.
下面我们主要是看看Mat提供的函数。
首先是构造函数,光构造函数就有很多种,这里介绍几种常用的方式:
1.使用(nrows, ncols, type),初始化2维矩阵
// 创建一个7*7的2通道浮点矩阵,通常这样的矩阵用来表示复矩阵
Mat M(7,7,CV_32FC2,Scalar(1,3));
//改变为100*60的15通道uchar矩阵,原先的数据将会被释放
M.create(100,60,CV_8UC(15));
创建高维矩阵
//创建100*100*100的3维矩阵
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));
下面是一些简单的对整行、整列的操作
// 第5行*3 + 第3行,这样的操作在线性代数中很常见
M.row(3) = M.row(3) + M.row(5)*3;
// 把第7列拷贝到第1列
// M.col(1) = M.col(7); // 不能这样写
Mat M1 = M.col(1);
M.col(7).copyTo(M1);
用源图像的一部分创建新图像
// 创建一个320*240的图像
Mat img(Size(320,240),CV_8UC3);
// 选择感兴趣区域
Mat roi(img, Rect(10,10,100,100));
// 将区域改为绿色,原图像也会发生修改
roi = Scalar(0,255,0);
B是A的[1,3)列,对B的修改会影响A
int main(void)
Mat A = Mat::eye(5,5,CV_8U);
Mat B = A(Range::all(),Range(1,3));
B.setTo(100);
for(int i = 0; i & 5;++i)
for(int j = 0; j & 5;++j)
cout&&(int)A.at&uchar&(i,j)&&
如果需要深拷贝,则使用clone方法。
对于初始化Mat,还有其他的一些方法:
比如Matlab风格的 zeros(), ones(), eye():
M += Mat::eye(M.rows, M.cols, CV_64F);
Mat M = (Mat_&double&(3,3) && 1, 0, 0, 0, 1, 0, 0, 0, 1);
如果是处理“外来”的数据,那么则在构造函数中加上data则会非常方便的将外来数据转化为Mat结构:
void process_video_frame(const unsigned char* pixels,int width, int height, int step)
Mat img(height, width, CV_8UC3, pixels, step);
GaussianBlur(img, img, Size(7,7), 1.5, 1.5);
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();
特别的,对于与opencv1.X中的IplImage结构的交互:
IplImage* img = cvLoadImage(&greatwave.jpg&, 1);
Mat mtx(img); // convert IplImage* -& Mat
CvMat oldmat = // convert Mat -& CvMat
说完了,构造、初始化,应该讨论元素访问的方法,这个在之前的博客中也有提过《我的OpenCV学习笔记(二):操作每个像素》这里就不再重复了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1086303次
积分:12079
积分:12079
排名:第921名
原创:275篇
转载:15篇
评论:462条
(1)(1)(5)(6)(4)(3)(3)(2)(3)(4)(3)(8)(1)(2)(1)(2)(4)(8)(5)(3)(2)(6)(28)(19)(52)(19)(27)(31)(27)(11)2015年4月 C++ Builder大版内专家分月排行榜第二
2013年12月 C++ Builder大版内专家分月排行榜第三
2015年4月 C++ Builder大版内专家分月排行榜第二
2013年12月 C++ Builder大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。街上有懂opencv的么,毕业设计碰见一点问题希望大家能帮帮忙
21回复 357浏览
lz今年大三,专业学的是电子信息工程,然后最近跟着老师做毕业设计,给了一个课题是基于opencv的人脸数目检测,但是我大学期间并没有用过opencv,完全0基础,而且只学过C语言,不知道这个课题的难度如何,我这个0基础的能搞的定么?
都没人会么。。。
如果感兴趣的话可以做做,如果只是为了毕业还是去找个简单的仿真设计题目,虽然你目前这个题目网上都有代码的
照亮黑暗纪元的萤火虫版的男纸
引用2楼 @ 发表的:
如果感兴趣的话可以做做,如果只是为了毕业还是去找个简单的仿真设计题目,虽然你目前这个题目网上都有代码的
这个我们毕业答辩搞得比较严,怕到时候自己没搞出来通过不了答辩
网上有现成的代码,把代码看懂,把用到的函数功能了解清楚,毕业答辩还是很好应付的
opencv做人脸识别很简单 官网的说明里就有例子 只要有点编程基础就没问题 另外推荐一个叫stackoverflow的网站 有问题在上面问一般会有人帮忙改的 不过好像在国内得翻墙
引用4楼 @ 发表的:
网上有现成的代码,把代码看懂,把用到的函数功能了解清楚,毕业答辩还是很好应付的
我就担心自己没学过这个,到时不会弄,然后身边同学又没人会,问都没人问。。。
引用5楼 @ 发表的:
opencv做人脸识别很简单 官网的说明里就有例子 只要有点编程基础就没问题 另外推荐一个叫stackoverflow的网站 有问题在上面问一般会有人帮忙改的 不过好像在国内得翻墙
这个还得用c++语言吧,初学者用opencv做人脸识辨还是很简单的是吧?
引用7楼 @ 发表的:
这个还得用c++语言吧,初学者用opencv做人脸识辨还是很简单的是吧?
不难 因为我也是学渣 但用起来没什么问题 主要挺好理解的 c,c
,python什么的都可以用opencv
引用6楼 @ 发表的:
我就担心自己没学过这个,到时不会弄,然后身边同学又没人会,问都没人问。。。
opencv的资料网上很多,你现在时间还比较充裕,花点时间看看,还是很容易上手的
妈的我只懂Ctrl cv
还是需要一定时间学习的,不过opencv网上资料太多,你可以从基础的开始看,到时候下载一个人脸检测的源代码,一定看懂,答辩不会跪的
照亮黑暗纪元的萤火虫版的男纸
不超过10行代码,完成你的毕设,话说人脸检测已经被玩滥了。cv届唯一的遮羞布就是人脸检测,其他的屁也干不了,出一大堆垃圾论文发自手机虎扑
终于能为jrs 做点贡献了
opencv主要是配置麻烦点
它自带的人脸识别其实效果不好
你搜一下libfacedetection 那个效果还不错
但是那只是个库
基本框架还是opencv的发自手机虎扑
坚持就是胜利
如果懂一些基础的computer vision的话还是可以自己找材料学学的。如果没学过computer vision的话建议先补充补充理论基础,要不然直接看代码会很吃力
引用10楼 @ 发表的:
妈的我只懂Ctrl cv
亮你了。。。
引用13楼 @ 发表的:
终于能为jrs 做点贡献了
opencv主要是配置麻烦点
它自带的人脸识别其实效果不好
你搜一下libfacedetection 那个效果还不错
但是那只是个库
基本框架还是opencv的
恩,先自学一下
计算机视觉 的入门书,然后看看cv的教程,多去csdn看看,时间多,先理解算法理,再去看代码,完全忽悠过去
鬼手,暗影步,凌厉诡谲,无坚不摧,弱冠前以之与群雄争锋。正中带有七分邪,邪中带有三分正。
引用17楼 @ 发表的:
先看点
计算机视觉 的入门书,然后看看cv的教程,多去csdn看看,时间多,先理解算法理,再去看代码,完全忽悠过去
行,先自学一下看看,到时候再来街上打听一下
简单的很,网上源码都找的到
引用19楼 @ 发表的:
简单的很,网上源码都找的到
这个我们毕业论文查的很严,估计还是得自己搞懂,所以不知道自己学能不能学会
您需要登录后才可以回复,请
& 允许多选
18人参加识货团购139.00元40人参加识货团购239.00元39人参加识货团购299.00元135人参加识货团购649.00元55人参加识货团购288.00元53人参加识货团购499.00元42人参加识货团购329.00元31人参加识货团购379.00元173人参加识货团购349.00元186人参加识货团购368.00元75人参加识货团购368.00元63人参加识货团购579.00元

我要回帖

更多关于 学opencv找工作如何 的文章

 

随机推荐