为 OpenCV 的 C++ createTrackbar 运行 C 包装器时出现编译分段错误(核心转储)

Posted

技术标签:

【中文标题】为 OpenCV 的 C++ createTrackbar 运行 C 包装器时出现编译分段错误(核心转储)【英文标题】:Getting Compilation segmentation fault (core dumped) when running a C wrapper for OpenCV's C++ createTrackbar 【发布时间】:2014-03-26 23:53:03 【问题描述】:

这是我对 createTrackbar 的包装。我不确定这是我使用它的方式还是它的编写方式。到目前为止,我将 onChange 和 userdata 中的 O 更改为 NULL,我将 String* 类型更改为 const char*。这可能是我将 TrackbarCallback* 定义为指针的方式。但我不确定是否有任何其他方式来定义它。

int cv_createTrackbar(String*  trackbarname,String* winname, int* value, 
    int count, TrackbarCallback* onChange=0, void* userdata=0)

    return cv::createTrackbar(*trackbarname, *winname, value,
        count, *onChange, userdata);

这是我使用它的代码的一部分。所有其他代码都运行了,但是当我只添加 cv_createTrackbar 行时,我在帖子标题中得到了错误。我取出线路,代码运行良好。当我将 a 和 b 声明为 const char* 时,我尝试调用 new String (a) and (b) as *(&a),之后我还尝试调用 &a 和 &b。我所有的旧技巧似乎都不适用于这个,所以如果有人可以给我建议,我一定会很感激。

 namedWindow("My Window", 1);
 const char* a = "Contrast";
 const char* b = "My Window";
 int iSliderValue1 = 50;
 cv_createTrackbar(new String (a), new String(b), &iSliderValue1, 100);

再次出错: 编译分段错误(核心转储)在 3 月 26 日星期三 16:35:55

【问题讨论】:

【参考方案1】:

onChange 参数的默认值为 0 (NULL)。您没有将onChange 传递给cv_createTrackbar,因此使用默认值。您尝试在函数中将其取消引用为*onChange。取消引用 NULL 指针将导致分段错误(核心转储)。

createTrackbar 的原型是:

int createTrackbar(const string& trackbarname, const string& winname,
    int* value, int count, TrackbarCallback onChange=0, void* userdata=0);

文档说明:

onChange – 指向每次滑块改变位置时调用的函数的指针。这个函数的原型应该是 void Foo(int,void*); ,其中第一个参数是trackbar位置,第二个参数是用户数据(见下一个参数)。如果回调是空指针,则不调用回调,只更新值。

由于onChange 需要一个指针并且文档明确指出NULL 是有效的,因此您需要将*onChange 更改为onChange。取消引用不是必需的。

另外,将函数参数的TrackbarCallback* 更改为TrackbarCallback。它不需要是指向指针的指针。

【讨论】:

如果您不熟悉该术语,请参阅 ***.com/questions/4955198/… 了解指针取消引用的说明。 @esorton..谢谢我,非常感谢,内容丰富的答案..你看,你是 100% 正确的..它就像一个魅力..我接受了你的回答并投票向上:)

以上是关于为 OpenCV 的 C++ createTrackbar 运行 C 包装器时出现编译分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C++ 数组转换为 opencv Mat

将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat

在 C++ 中读取 DICOM 并转换为 OpenCV

如何在 OSX 中使用 C++ opencv highgui 将活动窗口设置为 opencv 图像

为 Visual C++ 9.0 编译 OpenCV

python调用c++接口,参数为opencv读取数据