OpenCV,dlib - 图像类型转换在函数中失效;在外面工作

时间:2016-02-28 22:41:34

标签: c++ opencv dlib

该计划的逻辑如下:

using namespace dlib;

int main()
{
    while (flag)
    {
        cv::Mat3b frame0;
        camera0 >> frame0;
        cv::imshow("Video0", frame0);

        array2d<rgb_pixel> img;
        assign_image(img, cv_image<bgr_pixel>(frame0));
        cv::imshow("Video0_processed", toMat(img));
        ...
    }
    ...
}

它运作得很好。

当我将其更改为

cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img);

int main()
{
    while (flag)
    {
        cv::Mat3b frame0;
        camera0 >> frame0;
        cv::imshow("Video0", frame0);

        cv::imshow("Video0_processed", convert_back_and_forth(frame0));
        ...
    }
    ...
}

cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img)
{
    array2d<rgb_pixel> img;
    assign_image(img, cv_image<bgr_pixel>(cv_img));
    return toMat(img);
}

崩溃没有任何错误。该程序只是终止。

版本

cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img);

int main()
{
    cv::Mat3b frame0;
    while (flag)
    {
        camera0 >> frame0;
        cv::imshow("Video0", frame0);
        ...
    }
    cv::imshow("Video0_processed", convert_back_and_forth(frame0));
    ...
}

cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img)
{
    array2d<rgb_pixel> img;
    assign_image(img, cv_image<bgr_pixel>(cv_img));
    return toMat(img);
}

的工作原理。但当然功能不一样。第1版和第2版有什么区别?为什么初始可以在后者失败的情况下起作用?

修改

我刚刚发现,如果我在全局范围内声明array2d<rgb_pixel> img,则该程序的第二个版本可以正常工作。然而,它并没有真正回答这个问题。

1 个答案:

答案 0 :(得分:0)

您是否阅读过dlib :: toMat的文档? :)

dlib::toMat()的文档说明了这一点:

返回一个OpenCV Mat对象,它表示与img相同的图像。这个               通过将Mat对象设置为指向与img相同的内存来完成。               因此,返回的Mat对象仅在指针时有效               img中的像素仍然有效