这是我的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发生编译分段错误(内核已转储)

最佳答案

onChange参数的默认值为0(NULL)。您不将onChange传递给cv_createTrackbar,因此使用默认值。您尝试在函数中将其作为*onChange取消引用。取消引用NULL指针将导致分段错误(内核已转储)。
createTrackbar的原型(prototype)是:

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

并且文档指出:



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

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

关于c++ - 为OpenCV的C++ createTrackbar运行C包装程序时出现编译段错误(内核已转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22675530/

10-16 05:09