试试水_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外面加了个保护罩一样。

后面我会自己来实现这个功能,分析实现中自己遇到的种种问题,我是菜鸟,问题可能很基础,请大家见谅。

有大神对此有更深的体会,请告诉我,互相学习。

0 0
原创粉丝点击