算是第一次接觸視覺的知識吧,學習的初衷並不是想做得那麼深入,僅僅是爲了補盲吧,利用一些瑣碎閒暇的時間去理解一些新的知識,以至於對於一些論文或者別人談論相關話題的時候,什麼都聽不懂。所以我打算從高翔博士的《視覺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秒