#include<iostream>
#include<chrono>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
int main(){
// 读取图片
cv::Mat image;
image = cv::imread("test.jpg");
// 判断图像文件是否正常读取
if(image.data == NULL){
cerr<<"文件不存在"<<endl;
}
// 输出基本信息
cout<<"图像宽为 :"<<image.cols <<", 高为 : "<< image.rows <<" ,通道数为 : "<<image.channels() <<endl;
// 显示
cv::imshow("image",image);
cv::waitKey(0);
// 判断image的类型
if(image.type() != CV_8UC1 && image.type() != CV_8UC3){
// 图像不符合要求
cout<<"请输入一张彩色图或者灰度图"<<endl;
return 0;
}
// 遍历图片
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
for(size_t y=0; y<image.rows; y++){
for(size_t x=0; x<image.cols; x++){
// 访问位于x,y处的像素
// 用cv::Mat::Ptr获得图像的行指针
unsigned char* row_ptr = image.ptr<unsigned char>(y); // row_ptr是第y行的头指针
unsigned char* data_ptr = &row_ptr[x*image.channels()]; // data_ptr指向带访问的数据像素
// 输出该像素的每个通道
for(int c=0; c!= image.channels(); c++){
unsigned char data = data_ptr[c]; // data为(x,y)第c个通道的值
}
}
}
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2-t1);
cout<<"遍历用时 : "<<time_used.count() <<"秒"<<endl;
// cv::Mat的拷贝
// 直接赋值并不会复制数据
cv::Mat img = image;
// 修改img会导致image发生变化
img(cv::Rect(0,0,100,100)).setTo(0); // 将左上角100*100的像素块置零
cv::imshow("image",image);
cv::waitKey(0);
// 使用clone函数来复制数据
cv::Mat image_clone = image.clone();
image_clone(cv::Rect(0,0,100,100)).setTo(255);
cv::imshow("image",image);
cv::imshow("image_clone",image_clone);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}