在 C 中包装 vector<Mat> 时出现分段错误错误
Posted
技术标签:
【中文标题】在 C 中包装 vector<Mat> 时出现分段错误错误【英文标题】:I'm getting a Segmentation Fault Error when wrapping vector<Mat> in C 【发布时间】:2014-03-30 02:37:48 【问题描述】:页面底部是我运行的整个代码以供参考。我正在尝试将vector<Mat>
包装在C 中,我已经将vector<Point2f>
包装在C 中,并且我将vector<Mat>
包装相同。 Point2f 版本运行良好,但 Mat 版本出现 Segmentation Fault 错误(核心转储)。
这是我的矢量包装器:
vector_Point2f* std_carrayTovectorp2f(Point2f* a, size_t len)
vector<Point2f>* v = new vector<Point2f>;
for(size_t i = 0; i < len; i++)
v->push_back(a[i]);
return v;
这是我的矢量包装器:
vector_Mat* std_carrayTovectorm(Mat* a, size_t len)
vector<Mat>* v = new vector<Mat>;
for(size_t i = 0; i < len; i++)
v->push_back(a[i]);
return v;
看到它们都被包裹起来了。我需要保持Mat* a
输入参数和vector_Mat*
返回相同。加上保持相同的功能,其他一切都可以改变。任何帮助表示赞赏。
整个代码:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <stdio.h>
#include <iostream>
using namespace std;
using namespace cv;
typedef vector<Point2f> vector_Point2f;
typedef vector<Mat> vector_Mat;
vector_Mat* std_carrayTovectorm(Mat* a, size_t len)
vector<Mat>* v = new vector<Mat>;
for(size_t i = 0; i < len; i++)
v->push_back(a[i]);
return v;
vector_Point2f* std_carrayTovectorp2f(Point2f* a, size_t len)
vector<Point2f>* v = new vector<Point2f>;
for(size_t i = 0; i < len; i++)
v->push_back(a[i]);
return v;
int main()
Mat* m, n, o;
vector_Mat* v = std_carrayTovectorm(m, 1);
cout << v;
【问题讨论】:
我确定您动态分配矢量对象是有原因的。就像您使用不确定的参数m
调用std_carrayTovectorm
一定是有原因的。我只是想不出任何一个的原因。
@WhozCraig...你能告诉我我到底哪里错了吗?
【参考方案1】:
m
在传递给std_carrayTovectorp2f()
时未初始化。
【讨论】:
std_carrayTovectorm 你的意思 @Jonathan Leffler 感谢您的回复,您能否详细说明“m 在传递给 std_carrayTovectorp2f() 时未初始化”的意思? @user3411335:你有:Mat* m;
创建但不初始化指针。然后vector_Mat* v = std_carrayTovectorm(m, 1);
将未初始化的指针传递给std_carrayTovectorm()
。第一个参数不是对指针的引用,因此该函数被赋予一个不确定的值——它不能保证为 NULL(或nilptr
)或任何其他值。如果你有Mat m
(就像你有Mat n;
和Mat o;
一样——你确实知道这两个不是指针,不是吗?这就是人们不知道的原因'不喜欢Mat* m
符号);那么你会有一个默认的初始化Mat
。以上是关于在 C 中包装 vector<Mat> 时出现分段错误错误的主要内容,如果未能解决你的问题,请参考以下文章
将 Mat 转换为 <vector<vector>> C++
std::vector<cv::Vec3b> 到 cv::Mat