C++OpenCV中的快速索引

Fast indexing in C++ OpenCV

本文关键字:索引 C++OpenCV      更新时间:2023-10-16

我对Python中的OpenCV非常熟悉。我最近切换到了C++版本,由于我太习惯了numpy的数组,所以cv::Mat索引一直存在问题。特别是,我正在努力寻找是否有一种更好的方法可以在不迭代的情况下对数组的受限区域进行操作。例如,假设我有一个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++中实现这一点?

最好的方法可能是使用感兴趣的区域。通过以下方式使用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。

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

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

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