C++ OpenCV 中的快速索引

Fast indexing in C++ OpenCV

我在 Python 中对 OpenCV 相当满意。我最近切换到 C++ 版本,并且我一直在使用 cv::Mat 索引时遇到问题,因为我太习惯了 numpy 的数组。 特别是,我试图找出是否有更好的方法可以在不遍历数组的情况下对数组的限制区域进行操作。 例如,假设我有一个 10x15 酉矩阵,我想将除最后一行以外的所有内容都设为零(或另一个随机数);在 Python,我会做这样的事情:

import numpy as np

a = np.ones([10,15])
a[:-1,:-1] = 0

如何在定义了 cv::Mat a = cv::Mat::ones(10, 15, CV_32FC1); 的 C++ 中实现?

我不知道这是否是最有效的方法,如果不是,那么有人会纠正我。

一种方法是逐行设置图像值

for (int i = 0; i < image.rows-1; ++i)
{
  image.row(i).setTo(Scalar(0,0,0));
}

或者如果图像数据指针继续,则使用std::fill

if(image.isContinuous())
    std::fill_n(image.data, (image.rows-1) * image.cols * image.elemSize(), 0);

最好的方法可能是使用感兴趣区域。可以通过以下方式使用 rect 轻松地对 cv mat 进行分区:

using namespace cv;

Mat a = Mat::ones(10, 15, CV_32FC1);
Rect rect(2, 2, 4, 4);
Mat roi = a(rect);

您以后可以按照自己喜欢的方式修改 roi,通过以下方式放回 a

 roi.copyTo(a(rect));

你可以优雅地在上一行中使用一个新的Rect,只要它的宽度和高度与原来的Rect相同即可。要解决您的具体问题,最简单的方法是制作一个全为零的新矩阵,然后对那个矩阵使用 copyTo。