cv::Mat::split(args)的正确args。

问题描述 投票:0回答:1

我需要使用函数split(),它的签名是 。

void split(const Mat& src, Mat* mvbegin)

我是通过 公文.我尝试了以下方法。

#include<opencv2/opencv.hpp>
#include<stdint.h>
#include<array>
#include<vector>

using namespace std; 
using namespace cv; 

int main(){

    //Common Parts : 
    //Loading the image : 
    Mat modified1 = imread("sample.jpg",CV_LOAD_IMAGE_COLOR);

    /* ATTEMPT 1 : This works : 
    *********************/
    vector<cv::Mat> rgb ;
    cv::split(modified1 , rgb); 

    /********************/

    /* ATTEMPT 2 : Does not work
    ********************/
    Mat* rgb1{nullptr} ;
    //rgb1 = &modified1;  Doesn't make a difference.
    cv::split(modified1 , rgb1); 
    /********************/

    return 0 ; 
}

这个... Attempt 1 这就是我在stackoverflow上看到的人们在寻找答案时的做法。我得到的错误是 Attempt2 是。segmentation fault (core dumped)

我的问题是:1.)为什么不。Attempt2 当我遵循函数签名时,我的工作是什么?

2.)为什么 Attempt1 工作?

c++ opencv c++14 opencv3.0
1个回答
0
投票

你必须使用下面的重载函数。

Mat rgb1[3] ;
cv::split(modified1 , rgb1); 

关于为什么我们要使用这样的函数的额外信息,你可以通过下面的文档来了解一下 联系,特别是下面这个。

mvbegin: 输出数组; 数组的数量必须与src.channels()相匹配; 如果需要的话,数组本身会被重新分配。

所以它说你应该定义一个大小为3的数组(或src.channels)。


0
投票

所以,我已经知道了如何做,感谢@的帮助。ypnos.

1.) 必须记住,如果一个 arrayC++ 被初始化为 。

int arr1[3] ={31,21,57};
cout<<*arr1<<endl //Prints 31 

意味着数组指向存储在数组中的第一个元素。这在 std::array 不过。

所以基于同样的理解,我们可以将数组初始化,然后拆分为.NET Framework。

  Mat rgb1[3]  ;
cv::split(modified1 , rgb1); 

这样 rgb1 类型的指针。Mat 并使其签名具体化。

void split(const Mat& src, Mat* mvbegin)

但事实上 mvbegin 必须是一个大小为3的数组,而不仅仅是指针对象,这是我没有找到的。明确 写在 文件 .

© www.soinside.com 2019 - 2024. All rights reserved.