【问题标题】:OpenCV, dlib - image type conversion failes in a function; works outsideOpenCV、dlib - 函数中的图像类型转换失败;在外面工作
【发布时间】:2016-06-11 21:09:54
【问题描述】:

程序的逻辑如下:

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);
}

有效。但当然功能是不一样的。第一版和第二版有什么区别?为什么初始可能工作而后者失败?

编辑:

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

【问题讨论】:

  • 顺便说一句,声明 cv::Mat outside 循环的变量是更好的做事方式。这只是效率问题。在第一次迭代之后,变量将“指向”一个内存块,其大小由第一个捕获的帧指定。每次连续迭代都会覆盖内存中该位置的数据,而不是创建新的数据,这正是在循环中创建变量时会发生的情况。

标签: c++ opencv dlib


【解决方案1】:

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

dlib::toMat() 的文档是这样说的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多