在 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&lt;Mat&gt; 包装在C 中,我已经将vector&lt;Point2f&gt; 包装在C 中,并且我将vector&lt;Mat&gt; 包装相同。 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

在 Cython 中包装返回复杂类型向量的函数

c ++如何将视频序列放入OpenCV中的vector<Mat>?

将 cv::Mat 转换为 vector<int>

C++ - SIGSEGV 在向量<Mat> 上执行 push_back