AI吃大瓜 2018-05-09 03:22 采纳率: 75%
浏览 1697
已采纳

OpenCV函数返回的简单问题

下面是一个OpenCV的小程序:

 #include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

template<typename _Tp>
vector<_Tp> convertMat2Vector(const Mat &_t1f)
{
    //_t1f.convertTo(t1f, CV_64F);
    return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行
}


template<typename _Tp>
cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows)
{
    cv::Mat mat = cv::Mat(v);//将vector变成一列的mat
    cv::Mat dest=mat.reshape(cn, rows);
    cout << "dest=\n" << dest << endl;
    return dest;
}


int main()

{
    int arr[4][3] = { { 1, 1,1 },{ 2, 2,2 },{ 3, 3,3 },{ 4,4, 4 } };
    cv::Mat srcData(4, 3, CV_8UC1, arr);
    cout << "srcData=\n"<< srcData<< endl;
    vector<uchar> v = convertMat2Vector<uchar>(srcData);
    cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀?
    cout << "dest=\n" << dest << endl;



    system("pause");
    waitKey();
    return 0;
}

运行结果:
图片说明

问题是:各位大神啊,我这哪里出问题?为什么函数里的dest和还回的dest的结果值为什么不一样的呀?

  • 写回答

4条回答

  • 默默悟问 2018-05-09 07:40
    关注

    因为第2个方法的mat对象会释放,而dest引用的数据是来自于mat,并没有拷贝数据,因此在mat没有释放的情况下是正常的,
    之后引用的内存就被释放而成为野数据。另外你srcData也不对。修改如下:

     #include <opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    
    template<typename _Tp>
    vector<_Tp> convertMat2Vector(const Mat &_t1f)
    {
        //_t1f.convertTo(t1f, CV_64F);
        return (vector<_Tp>)(_t1f.reshape(1, 1));//通道数不变,按行转为一行
    }
    
    
    template<typename _Tp>
    cv::Mat convertVector2Mat(vector<_Tp> v,int cn,int rows)
    {
        cv::Mat mat = cv::Mat(v);//将vector变成一列的mat
        cv::Mat dest=mat.reshape(cn, rows).clone();
        cout << "dest=\n" << dest << endl;
        return dest;
    }
    
    
    int main()
    
    {
        char arr[4][3] = { {1, 1, 1 },{ 2, 2, 2 },{ 3, 3, 3 },{ 4, 4, 4 } };
        cv::Mat srcData(4, 3, CV_8UC1, arr);
        cout << "srcData=\n"<< srcData<< endl;
        vector<uchar> v = convertMat2Vector<uchar>(srcData);
        cout << v.size() << endl;
        cv::Mat dest =convertVector2Mat<uchar>(v,1, 4);//函数里的dest和还回dest的结果为什么不一样的呀?
        cout << "dest=\n" << dest << endl;
    
        system("pause");
        waitKey();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 前台报错,加我微信帮我解决一下,15043457399
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题