gpt4 book ai didi

c++ - 在 opencv2/3 中清除图像的最有效方法

转载 作者:太空狗 更新时间:2023-10-29 20:55:31 24 4
gpt4 key购买 nike

我目前正在将旧的 OpenCV C 代码移植到 OpenCV 2/3 的 C++ 接口(interface),我不太确定旧函数的某些等价物。我很早就遇到了 cvZero 的问题。我发现的唯一可能性是通过 Mat::setTo 设置矩阵内容。现在,必须能够管理多 channel 标量和不同的数据类型,setTo 遍历矩阵的所有元素并一个接一个地设置它们,而 cvZero 基本上做了一个内存集。我想知道使用 C++ 接口(interface)的推荐方法是什么,以防我只想将我的图像清除为黑色。

谢谢!

最佳答案

yourMat = cv::Mat::zeros(yourMat.size(), yourMat.type()) 似乎没有分配新的内存,只是覆盖了现有的 Mat 对象(内存以前是已分配,否则 .size 为 0)。不确定 memset 是否在内部使用,但与使用 cv::Mat::zeros 的版本相比,此示例代码为使用 .setTo 的版本提供了 50% 的处理时间- 但我没有评估操作的偏移量(这在两个版本中应该完全相同)!

int main(int argc, char* argv[])
{
cv::Mat input = cv::imread("C:/StackOverflow/Input/Lenna.png");

srand(time(NULL));

cv::Mat a = input;
cv::Mat b = input;
cv::imshow("original", a);

b = cv::Mat::zeros(a.size(), a.type());

std::vector<int> randX;
std::vector<int> randY;
std::vector<cv::Vec3b> randC;

int n = 500000;

randX.resize(n);
randY.resize(n);
randC.resize(n);

for (unsigned int i = 0; i < n; ++i)
{
randX[i] = rand() % input.cols;
randY[i] = rand() % input.rows;
randC[i] = cv::Vec3b(rand()%255, rand()%255, rand()%255);
}

clock_t start1 = clock();
for (unsigned int i = 0; i < randX.size(); ++i)
{
b.at<cv::Vec3b>(randY[i], randX[i]) = randC[i];
b = cv::Mat::zeros(b.size(), b.type());
}
clock_t end1 = clock();

clock_t start2 = clock();
for (unsigned int i = 0; i < randX.size(); ++i)
{
b.at<cv::Vec3b>(randY[i], randX[i]) = randC[i];
b.setTo( cv::Scalar(0, 0, 0));
}
clock_t end2 = clock();

std::cout << "time1 = " << ( (end1 - start1) / CLOCKS_PER_SEC ) << " seconds" << std::endl;
std::cout << "time2 = " << ((end2 - start2) / CLOCKS_PER_SEC) << " seconds" << std::endl;


cv::imshow("a", a);
cv::imshow("b", b);

cv::waitKey(0);
return 0;
}

给我输出:

time1 = 14 seconds
time2 = 21 seconds

在我的机器上( Release模式)(无 IPP)。ab 都是黑色图像,表示没有分配新内存,但使用了现有的 Mat 内存。

int n = 250000; 将产生输出

time1 = 6 seconds
time2 = 10 seconds

这不是关于 memset 是否在内部使用或者它是否与 cvZero 一样快的答案,但至少你现在知道如何比 .setTo 更快地设置为零了

关于c++ - 在 opencv2/3 中清除图像的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35506856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com