opencv Mat::forEach 与 for 遍历效率的比较:for 更快
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/features2d.hpp>
#include <ctime>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int decoloring(cv::Mat& image, int midValue)
{
clock_t t = clock();
image.forEach<uchar>(
[midValue, &image](uchar& point, const int* position) -> void
{
if (point >= midValue)
{
point = 255;
}
else
{
point = 0;
}
}
);
cout << "\nforeach time:" << clock() - t << endl;
t = clock();
int row = image.rows;
int col = image.cols;
int size = row * col;
uchar* index = image.ptr(0);
uchar* end = index + row * col;
for (; index != end; index++)
{
if (*index >= midValue)
{
*index = 255;
}
else
{
*index = 0;
}
}
cout << "\nfor time:" << clock() - t << endl;
return 0;
}
int main(int argc, char* argv[])
{
string imageName = argv[1];
Mat img = imread(imageName, IMREAD_GRAYSCALE);
Mat imgDemo = img(Range(0, 500), Range(0, 500));
Mat outputImg;
int midv = 0;
while (midv >= 0)
{
cout << "Enter mid: ";
cin >> midv;
imgDemo.copyTo(outputImg);
decoloring(outputImg, midv);
waitKey(0);
}
/*namedWindow("test", WINDOW_AUTOSIZE);
imshow("test", imgDemo);*/
waitKey(0);
return 0;
}
结果截图