Opencv中有很多的方法遍历图片,笔者列出所遇见的几种遍历图片元素的方法其实就是如何遍历矩阵。为了查看出几种遍历图形的的不同,代码中会通过chrono来计算每次遍历的时间。
1、方法1:
使用Opencv中的指针对获取的图形进行遍历。
使用到Mat::ptr()此函数返回的是uchar类型,返回的是y行的第一个元素的指针。通过指针的话就可以实现对图片的遍历。我们处理的图形分别有彩色和灰度的,彩色图形一般是RGB这样需要遍历三个矩阵。就需要Mat::channels()返回的是通道数。RGB为3灰度为1。接下来我们就可以开始遍历图片了。
chrono::steady_clock::time_ponit t1=chrono::steady_clock::now();
for(seiz_t y=0;y<img.rows;y++
{
unsigned char* row_ptr=img.ptr<unsigned char>(y);//指向y行第一个元素的指针
for(size_t x;x<img.cols;x++)
{
unsigned char *data_ptr=&row_ptr[x*img.channels()];//img.channnels返回的图形的通道数,rgb为3 灰度为1
for(int c=0;c<img.channels();c++
{
unsigned char datea=data_ptr[c];
}
}
}
chrono::duration<double> time_used =chrono::duration_cast<chrono::duration<double>>
(t2-t1);
cout<<"遍历图形时间:\n"<<time_used.count()<<"秒"<<endl;
2、方法2:
本方法就很简单直接使用Mat的对象进行遍历。废话不多说直接上代码!使用Mat::at(int row ,int col)对图形进行遍历
chrono::steady_clock::time_point t3=chrono::steady_clock::now();
for(int y=0;y<img.rows;y++)
{
for(int x=0;x<img.cols;x++)
{
for (int i = 0; i < img.channels(); i++)
{
unsigned char data=img.at<cv::Vec3b> (y,x)[i];
}
}
}
chrono::steady_clock::time_point t4=chrono::steady_clock::now();
chrono::duration<double> timecha=chrono::duration_cast<chrono::duration<double>>(t4-t3);
cout<<"遍历图形时间:\n"<<timecha.count()<<"秒"<<endl;