Day 8 - Opencv 用迭代器扫描图像
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <random>
#include <iostream>
//减色函数
void reduceColor(cv::Mat image, int n);
int main(int argc, char** argv)
{
cv::Mat image = cv::imread("15011.jpg");
if (image.empty())
{
std::cout << "\n Durn, couldn't read image filename " << std::endl;
return 1;
}
cv::namedWindow("Original Image");
cv::imshow("Original Image", image);
auto startTime = std::chrono::system_clock::now();
reduceColor(image, 32);
auto endTime = std::chrono::system_clock::now();
std::cout << "time:" << std::chrono::duration_cast<std::chrono::microseconds>(endTime - startTime).count() << std::endl;
cv::namedWindow("ReducedColr Image");
cv::imshow("ReducedColr Image", image);
cv::waitKey(0);
return 0;
}
//image: 输入图像
//div : 减色因子
void reduceColor(cv::Mat image, int div)
{
double nTemp = std::log(static_cast<double>(div)) / std::log(2.0); //求解给定div下的n值 div = pow(2, n);
int n = static_cast<int>(nTemp + 0.5); //0.5相当于四舍五入
//掩码,求div的倍数
uchar mask = 0xFF << n;
uchar div2 = div >> 1;
//创建迭代器
cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
for (; it != itend; ++it)
{
(*it)[0] &= mask;
(*it)[0] += div2;
(*it)[1] &= mask;
(*it)[1] += div2;
(*it)[2] &= mask;
(*it)[2] += div2;
}
}
通过迭代器的减色算法,运行速度比较慢, 46097us.