視覺SLAM(2)_圖像的存取與訪問

算是第一次接觸視覺的知識吧,學習的初衷並不是想做得那麼深入,僅僅是爲了補盲吧,利用一些瑣碎閒暇的時間去理解一些新的知識,以至於對於一些論文或者別人談論相關話題的時候,什麼都聽不懂。所以我打算從高翔博士的《視覺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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章