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

视频:https://www.youtube.com/watch?v=5HBlpuihzks
这是密码:
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);
}
}经修订的守则:
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);
}
}发布于 2020-11-01 10:14:34
cv::addWeighted(depth_image_ocv, 1.0 - factor, last_image, factor, 0.0, result);只有当depth_image_ocv和last_image矩阵都是浮点类型(F32_C1)时,上线才能正确工作.然而,请看这里:
last_image = result;这并不能将result复制到last_image中;它是只复制引用,因此从现在起last_image和result是相同的矩阵。
该矩阵随后通过将其转换为字节类型而失败:
result.convertTo(result, CV_8UC1);因此,这不仅影响到result,而且也影响到last_image。使用clone或copyTo而不是operator=获取OpenCV矩阵的实际副本。
(这是一个与C++习语相反的糟糕的API设计,但它可能永远不会被修复。)
发布于 2020-11-01 10:14:01
删除行result.convertTo(result, CV_8UC1);
您正在将浮点图像转换为无符号字符图像,导致所有像素值要么为0,要么为1。只在战后将它们放大,从而生成像素值为0或255的图像。
https://stackoverflow.com/questions/64630435
复制相似问题