我需要使用函数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
工作?
你必须使用下面的重载函数。
Mat rgb1[3] ;
cv::split(modified1 , rgb1);
关于为什么我们要使用这样的函数的额外信息,你可以通过下面的文档来了解一下 联系,特别是下面这个。
mvbegin: 输出数组; 数组的数量必须与src.channels()相匹配; 如果需要的话,数组本身会被重新分配。
所以它说你应该定义一个大小为3的数组(或src.channels)。
所以,我已经知道了如何做,感谢@的帮助。ypnos.
1.) 必须记住,如果一个 array
在 C++
被初始化为 。
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的数组,而不仅仅是指针对象,这是我没有找到的。明确 写在 文件 .