试试水_OPENCV中关于带const _OutputArray& _dst形参的函数,居然还能改变_dst的内容
来源:互联网 发布:三菱编程软件的安装 编辑:程序博客网 时间:2024/06/05 12:40
第一次看到OPENCV里面函数的实现中的_dst,我也是蛮惊讶的。
因为它的类型竟然是const _OutputArray&。可能是我见识比较短浅,我居然对其中能改变_dst产生了极大的疑惑。
以前我学const的时候,怎么都没想到它居然还能被改变。我自己用也只是在函数里面,如果不对此变量做任何改变,就尽量声明为const类型。
这样有什么好处呢?就是为了不让自己的程序中改变这个形参,以后自己回头温习这些函数的时候,能很快的知道这个形参在函数中的大概作用。
所以咯,我就对OPENCV的dst感到很疑惑。
再补充一下,一般_dst是OutputArray,我一手贱,点转到定义,发现是typedef const _OutputArray& OutputArray,所以才会有如上的标题。
自己是看2.4.9的document中core中InputArray类一个例子myAffinetransform函数实现做出上面一行的动作的。至于为什么看document。其实我就看看,了解下。
函数先列出来
void myAffineTransform(InputArray _src, OutputArray _dst, InputArray _m){ // get Mat headers for input arrays. This is O(1) operation, // unless _src and/or _m are matrix expressions. Mat src = _src.getMat(), m = _m.getMat(); CV_Assert( src.type() == CV_32FC2 && m.type() == CV_32F && m.size() == Size(3, 2) ); // [re]create the output array so that it has the proper size and type. // In case of Mat it calls Mat::create, in case of STL vector it calls vector::resize. _dst.create(src.size(), src.type()); Mat dst = _dst.getMat(); for( int i = 0; i < src.rows; i++ ) for( int j = 0; j < src.cols; j++ ) { Point2f pt = src.at<Point2f>(i, j); dst.at<Point2f>(i, j) = Point2f(m.at<float>(0, 0)*pt.x + m.at<float>(0, 1)*pt.y + m.at<float>(0, 2), m.at<float>(1, 0)*pt.x + m.at<float>(1, 1)*pt.y + m.at<float>(1, 2)); }}
Mat dst = _dst.getMat();
这个就是_dst把自己的Mat和dst共享。共享是引用计数里面的,它们的指针指向同一个地址,引用计数加1,如果不懂这个引用计数,你完全可以百度看一些智能指针的实现,一天完全可以弄懂大概的东西。
下面有代码给dst.at<Point2f>(i,j)赋值改变其内容。
到此,先总结下。这里这个函数就是实现了我文章开头的奇怪的功能。
如果你能激动说,你能搞定,你可以自己试试看,能不能完成这个功能,能的话,说明你已经懂这个技术了。这个技术的好处,我自己觉得就是,不懂OutputArray类的人,是不会随随便便就改变其值的,因为它靠的是Mat,而Mat的东西又能改变,就是Mat外面加了个保护罩一样。
后面我会自己来实现这个功能,分析实现中自己遇到的种种问题,我是菜鸟,问题可能很基础,请大家见谅。
有大神对此有更深的体会,请告诉我,互相学习。
- 试试水_OPENCV中关于带const _OutputArray& _dst形参的函数,居然还能改变_dst的内容
- 关于如何能改变text的内容
- static void cvTsDistTransform( const CvMat* _src, CvMat* _dst, int dist_type, intmask_size, float* _
- 居然还能这样——程序员加薪的新方法
- C++中那些令人蛋疼的带const形参的重载函数
- C++中那些令人蛋疼的带const形参的重载函数
- 关于类成员函数结尾带const和不带const的问题
- 居然还能这么活
- 图片的翻转_opencv
- 图片的翻转_opencv
- 改变能改变的
- 改变能改变的
- C/C++中const变量与指针所指内容的改变
- 手机短信内容能查到,别人删除的手机短信内容还能查到吗
- [Sencha ExtJs6 Modern] 多选list在清空store之后,list.getSelections()居然还能得到原来选的records
- 函数中关于const关键字使用的注意事项
- 【凯子哥带你夯实应用层】还在用XListView?试试更漂亮的AutoLoadListView吧!
- 你还在用第三方开源下拉刷新控件吗?试试google自带的下拉刷新控件SwipeRefreshLayout
- Linux自动登陆的设置方法
- codeforces #487A# Fight the Monster(枚举)
- 关于使用爱盟IMSDK第三方即时通讯框架的一些使用心得
- 删除域名抢注实战
- 最近点问题(一)
- 试试水_OPENCV中关于带const _OutputArray& _dst形参的函数,居然还能改变_dst的内容
- 日语语法总结-1
- 原码, 反码, 补码详解
- 【转】inet_addr、inet_aton、inet_pton异同小结
- JPA开发总结<一>
- java移位运算符详解
- iOS中XML解析方式之SAX解析
- 干活干活干活
- android studio每次启动都要在fetching Android sdk compoment information停好久 怎么解决?