算是第一次接触视觉的知识吧,学习的初衷并不是想做得那么深入,仅仅是为了补盲吧,利用一些琐碎闲暇的时间去理解一些新的知识,以至于对于一些论文或者别人谈论相关话题的时候,什么都听不懂。所以我打算从高翔博士的《视觉SLAM十四讲》入手,通过实际应用去学习可能不会那么枯燥,暂时也没有其他很好学习途径。只要坚信积跬步,至千里。
#include<iostream>
#include<chrono>
using namespace std;
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
int main(int argc,char** argv)
{
//读取argv[1]指定的图像
cv::Mat image;
image=cv::imread(argv[1]);//读取指定路径下的图片
//判断图像文件是否正确读取
if(image.data==nullptr)
{
cerr<<"file"<<argv[1]<<"not exist!"<<endl;
return 0;
}
//文件顺利读取,首先输出一些基本信息
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为I(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 image_another=image;
//修改iage_another会导致Image发生变化
image_another(cv::Rect(0,0,100,100)).setTo(0);//将左上角100*100的块置零
cv::imshow("image_another",image_another);
//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();
}
CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 2.8)
project(test)
find_package(OpenCV REQUIRED)
include_directories(
${OpenCV_INCLUDE_DIRS}
)
add_compile_options(-std=c++11)
add_executable(test test.cpp)
target_link_libraries(test ${OpenCV_LIBS} )
结果:
liuzy@liuzy-ThinkPad-E490:~/LZY_Develop/Personal/C++_exercise/20200322_imageoperator/build$ ./test ubuntu.png
图像宽为:1200,高为:674,通道数为:3
遍历图像用时:0.012284秒