平均图像时图像损坏

时间:2018-11-02 04:45:09

标签: c++ opencv

我编写了以下代码来计算图像的平均值。

cv::Mat image(image_list[0].rows, image_list[0].cols, CV_64FC1);

for (unsigned int list_index = 0; list_index < image_list.size(); ++list_index) {
    int image_row = image_list[list_index].rows;
    int image_col = image_list[list_index].cols;

    for (int row = 0; row < image_row; ++row) {
        for (int col = 0; col < image_col; ++col) {
            image.at<double>(row, col) += static_cast<double>(image_list[list_index].at<uchar>(row, col));
        }
    }
}

for (int row = 0; row < image.rows; ++row) {
    for (int col = 0; col < image.cols; ++col) {
        image.at<double>(row, col) = cvRound(image.at<double>(row, col) / image_list.size());
    }
}

image.convertTo(image, CV_8UC1);
resultant_average_image = image;

在此使用image_list向量的第一个元素初始化图像,并在进行计算后将结果保存到result_average_image(这是类的属性)。 问题是我在这样做的时候,即使通常它也显示了我预期的结果。有时它会显示出损坏的图像。我找不到原因。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我怀疑第一行

// kostyl: for fix jumping of tableView as for tableView diffucult to calculate height of cells
    tableView.kostylAgainstJumping {
      if oldIsFolded {
        tableView.insertRows(at: indexPaths, with: .fade)
      } else {
        tableView.deleteRows(at: indexPaths, with: .fade)
      }
    }


extension UITableView {
  func kostylAgainstJumping(_ block: () -> Void) {
      self.contentInset.bottom = 300
      block()
      self.contentInset.bottom = 0
  }
}

分配具有尚未初始化的内存的图像。通常,它可能为零,但并非总是如此。那可以解释为什么结果图像看起来损坏了。尝试添加行

cv::Mat image(image_list[0].rows, image_list[0].cols, CV_64FC1);

在分配图像之后。

此外,我会处理image = cv::Scalar(0.0); 可能为空的特殊情况。