gpt4 book ai didi

c++ - 使用 MATLAB 和 OpenCV 对图像求和的效率

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:48 25 4
gpt4 key购买 nike

我对您的所有回答感到非常惊讶。 非常感谢!

错误代码如下:百分比 = (double)kk * 100.0/(double)totalnum;

我修改后为:百分比 = (double)kk * 100.0/totalnum;

问题已解决。而这个简单的除法大约消耗了 150 秒中的 90 秒。也许 doubleint 之间的除法比 doubles 之间的除法更快。

再次感谢您的所有回答!


我正在尝试从视频中的一组图片中获取平均图像。这项工作只有 2 个步骤:

  1. 将所有图像汇总成一个矩阵。
  2. 将矩阵除以图像数量。

我在 OpenCV 中使用了以下代码:(C++)

Mat avIM = Mat::zeros(IMG_HEIGHT, IMG_WIDTH, CV_32FC3);

for (ii = startnum; ii <= endnum; ii += interval) {
string fullname = argv[1];
sprintf(filename, "\\%d.png", ii);
fullname.append(filename);

Mat tempIM = imread(fullname.c_str());
if (tempIM.empty()) { cout << "Can't open image!\n"; return -1; }
tempIM.convertTo(tempIM, CV_32FC3);

avIM += tempIM; //Sum up every image
++kk;

}
avIM = avIM * (double)(1.0 / kk); //get average'

MatLab 中的以下代码:(2015a)

avIM = zeros(size(imread([im.dir,'\',num2str(startnum),'.png'])));

pointIdx = startnum:interval:endnum;
for j=pointIdx,
IM = imread([im.dir,'\',num2str(j),'.png']);
avIM = avIM + double(IM); %Sum up every image
end
avIM = uint8(round(avIM./size(pointIdx,2))); %get average

但是当我在 2,100 张图像上运行这两个程序时,OpenCV 花费了 150.3s(发布)而 MatLab 花费了 103.1s。 C++ 程序比 MatLab 脚本运行得慢,这让我很困惑。

那么是什么减慢了我的 OpenCV 程序的速度?如果是我的矩阵访问方式导致的,应该如何提高效率?

最佳答案

您的代码看起来不错,在我的测试中我发现它的运行速度比 Matlab 代码快 10 倍。

不过,我展示了一个稍微优化过的代码,它的执行速度比你的快一点。

注意事项

请注意,我没有以您命名的图像文件夹,所以我在 C++ 版本中使用 cv::glob,在 Matlab 版本中使用 dir 来获取文件夹中图像的名称。

我的文件夹里有82张小图,运行时间明显比你的小,但是相对性能应该是靠谱的。

执行时间

                    Sum only      Get filenames + Sum
Matlab: 0.173543 s (0.185308 s)
OpenCV @Seven Wang: 0.0145206 s (0.0155748 s)
OpenCV @Miki: 0.0128943 s (0.013333 s)

注意事项

请确保您在 OpenCV 和 Matlab 中一致地计算运行时间。


代码

Matlab代码:

tic

folder = 'D:\\SO\\temp\\old_075_6\\';
filenames = dir([folder '*.bmp']);

% Get rows and cols from 1st image
img = imread([folder name]);



S = zeros(size(img));

for ii = 1 : length(filenames)
name = filenames(ii).name;
currentImage = imread([folder name]);
S = S + double(currentImage);
end

S = uint8(round(S / length(filenames)));

toc

C++代码:

#include <opencv2\opencv.hpp>
#include <vector>
#include <iostream>

int main()
{
double ticLoad = double(cv::getTickCount());

std::string folder = "D:\\SO\\temp\\old_075_6\\*.bmp";
std::vector<cv::String> filenames;
cv::glob(folder, filenames);

int rows, cols;
{
// Just load the first image to get rows and cols
cv::Mat3b img = cv::imread(filenames[0]);
rows = img.rows;
cols = img.cols;
}

/*{
double tic = double(cv::getTickCount());

cv::Mat3d S(rows, cols, 0.0);

for (const auto& name : filenames)
{
cv::Mat currentImage = cv::imread(name);
currentImage.convertTo(currentImage, CV_64F);

S += currentImage;

}
S = S * double(1.0 / filenames.size());

cv::Mat3b avg;
S.convertTo(avg, CV_8U);

double toc = double(cv::getTickCount());

double timeLoad = (toc - ticLoad) / cv::getTickFrequency();
double time = (toc - tic) / cv::getTickFrequency();
std::cout << "@Seven Wang: " << time << " s (" << timeLoad << " s)" << std::endl;
}*/

{
double tic = double(cv::getTickCount());

cv::Mat3d S(rows, cols, 0.0);
cv::Mat3b currentImage;

for (const auto& name : filenames)
{
currentImage = cv::imread(name);
cv::add(S, currentImage, S, cv::noArray(), CV_64F);
}
S /= filenames.size();

cv::Mat3b avg;
S.convertTo(avg, CV_8U);

double toc = double(cv::getTickCount());

double timeLoad = (toc - ticLoad) / cv::getTickFrequency();
double time = (toc - tic) / cv::getTickFrequency();
std::cout << "@Miki: " << time << " s (" << timeLoad << " s)" << std::endl;
}
getchar();






return 0;
}

关于c++ - 使用 MATLAB 和 OpenCV 对图像求和的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37742530/

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