cvtColor在转换时崩溃

时间:2014-08-20 12:29:51

标签: opencv c++-cli

我将带有外部dll的相机加载到我的OpenCV程序中。我可以看到框架cv::imshow("edges", frame);,一切正常。 frame.channels()给了我3个频道,但是当我尝试cv::cvtColor(frame, gray, CV_BGR2GRAY);应用程序崩溃时。

CreateImage(System::Byte *imgData, int height, int width,int show)
{

    frame = cv::Mat(height, width, CV_8UC3, imgData);

    if (show > 0)
        cv::imshow("edges", frame); //I can see myself

    return frame.channels(); //three channels
}

void ConvertAndProcess()
{
    cv::Mat gray;

    cv::cvtColor(frame, gray, CV_BGR2GRAY); //crash...

    //do something
}

我已经挖了一段时间但没有结果。我做错了什么?

2 个答案:

答案 0 :(得分:5)

小心!

 frame = cv::Mat(height, width, CV_8UC3, imgData);

这是一个'借来的'指针。当imgData离开作用域时(在函数末尾),frame.data无效。

这意味着,如果你以这种方式构造它,你不能指望frame在ConvertAndProcess()中有效。

你可以克隆()它,以实现“深层复制”:

 frame = cv::Mat(height, width, CV_8UC3, imgData).clone();

答案 1 :(得分:2)

如果void ConvertAndProcess()包含某些内容,请检入frame。似乎frame是空的,因此没有什么可以从BGR转换为灰色。

您可以执行以下操作:

if(!frame.empty())
    cvtColor(frame, gray, CV_BGR2GRAY);
else
{
    cout<<"\nFrame is empty.";
    return;
}