首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于深度的时间去除会产生幽灵图像

基于深度的时间去除会产生幽灵图像
EN

Stack Overflow用户
提问于 2020-11-01 09:33:36
回答 2查看 49关注 0票数 0

我正在做深度图像的临时删除,我得到了一个幽灵的图像,如下面的视频所示

单一图像:

视频:https://www.youtube.com/watch?v=5HBlpuihzks

这是密码:

代码语言:javascript
复制
   while (key != 'q') {

        if (zed.grab(runtime_parameters) == ERROR_CODE::SUCCESS) {

            zed.retrieveImage(depth_image_zed_display, VIEW::DEPTH, MEM::CPU, new_image_size);

            zed.retrieveMeasure(depth_image_zed, MEASURE::DEPTH, MEM::CPU, new_image_size);
            cv::Mat dst;
            //cv::boxFilter(depth_image_ocv_display, dst, -1, cv::Size(1, 1));

            cv::Mat result;
            double factor = 0.5;
            cv::addWeighted(depth_image_ocv, 1.0 - factor, last_image, factor, 0.0, result);
            last_image = result;


            cv::imshow("dep", depth_image_ocv_display);


            cv::Mat ucharMat, ucharMatScaled;
            result.convertTo(result, CV_8UC1);
            // scale values from 0..1 to 0..255
            result.convertTo(ucharMatScaled, CV_8UC1, 255, 0);
            cv::imshow("filtered_ dep", ucharMatScaled);


            // Handle key event
            key = cv::waitKey(10);
        }
    }

经修订的守则:

代码语言:javascript
复制
while (key != 'q') {

        if (zed.grab(runtime_parameters) == ERROR_CODE::SUCCESS) {
             
            zed.retrieveImage(depth_image_zed_display, VIEW::DEPTH, MEM::CPU, new_image_size);

            zed.retrieveMeasure(depth_image_zed, MEASURE::DEPTH, MEM::CPU, new_image_size);
           
          /*
           cv::Mat dst;
           cv::boxFilter(depth_image_ocv, dst, -1, cv::Size(1, 1));

           */

           
        cv::Mat cpy_depth = depth_image_ocv.clone();
        cv::Mat result;
        double factor = 0.8;
        cv::addWeighted(cpy_depth, 1.0 - factor, last_image, factor, 0.0, result);
        last_image = result.clone();
    

        cv::imshow("dep", depth_image_ocv_display);
        cv::Mat final_depth;
        final_depth = result.clone();

        cv::Mat ucharMatScaled;
        final_depth.convertTo(ucharMatScaled, CV_8UC1, 0, 255);
        cv::imshow("filtered_ dep", ucharMatScaled);

            // Handle key event
            key = cv::waitKey(1);
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-01 10:14:34

代码语言:javascript
复制
        cv::addWeighted(depth_image_ocv, 1.0 - factor, last_image, factor, 0.0, result);

只有当depth_image_ocvlast_image矩阵都是浮点类型(F32_C1)时,上线才能正确工作.然而,请看这里:

代码语言:javascript
复制
        last_image = result;

这并不能将result复制到last_image中;它是只复制引用,因此从现在起last_imageresult是相同的矩阵。

该矩阵随后通过将其转换为字节类型而失败:

代码语言:javascript
复制
        result.convertTo(result, CV_8UC1);

因此,这不仅影响到result,而且也影响到last_image。使用clonecopyTo而不是operator=获取OpenCV矩阵的实际副本。

(这是一个与C++习语相反的糟糕的API设计,但它可能永远不会被修复。)

票数 3
EN

Stack Overflow用户

发布于 2020-11-01 10:14:01

删除行result.convertTo(result, CV_8UC1);

您正在将浮点图像转换为无符号字符图像,导致所有像素值要么为0,要么为1。只在战后将它们放大,从而生成像素值为0或255的图像。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64630435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档