功能简述:
分别通过at方法和迭代器遍历修改图像像素值,比较二者效率。
代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
//通过at方法遍历
void modify_pixel_at(cv::Mat src)
{
int i, j;
for (int j = 0; j < src.rows; j++)
{
for (int i = 0; i < src.cols; i++)
{
if (src.type() == CV_8UC1)
{
src.at<uchar>(j, i) = 255;
}
else if (src.type() == CV_8UC3)
{
src.at<cv::Vec3b>(j, i)[0] = 255;
src.at<cv::Vec3b>(j, i)[1] = 255;
src.at<cv::Vec3b>(j, i)[2] = 255;
}
}
}
}
//通过迭代器遍历修改像数值
void modify_pixel_iterator(cv::Mat &src)
{
cv::Mat_<cv::Vec3b>::iterator it = src.begin<cv::Vec3b>();
while (it != src.end<cv::Vec3b>())
{ //像素处理
(*it)[0] = 255;
(*it)[1] = 255;
(*it)[2] = 255;
++it;
}
}
int main(int argc, char** argv) {
cv::Mat src, dst;
src = cv::imread("D:/VS2015_Projects/opencv_workspace/img/opencvtest.jpg");
if(src.empty())
{
std::cout << "image load failed!" << std::endl;
return -1;
}
resize(src, src, cv::Size(src.cols / 4, src.rows / 4));
imshow("input image", src);
//两种遍历方法效率比较
const int64 start1 = cv::getTickCount();
//at方法遍历
modify_pixel_at(src);
double time_consuming1 = ((cv::getTickCount() - start1) /
cv::getTickFrequency());
std::cout << "modify_pixel_at : " << time_consuming1*1000 << "ms" << std::endl;
const int64 start2 = cv::getTickCount();
//迭代器方法遍历
modify_pixel_iterator(src);
double time_consuming2 = ((cv::getTickCount() - start2) /
cv::getTickFrequency());
std::cout << "modify_pixel_iterator : " << time_consuming2*1000 << "ms" << std::endl;
imshow("output image", src);
cv::waitKey(0);
return 0;
}
效果如下:
从运行结果得知:
at方法遍历耗时为:14ms左右
迭代器方法耗时为:24ms左右
通过对比可知,迭代器方法运行效率相对更低,但其更安全。