在Ubuntu14.04下安裝opencv3.1.0和pcl庫(kù)
安裝pcl
安裝pcl庫(kù)較為簡(jiǎn)單
在終端輸入以下代碼即可
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all
若是第三步出現(xiàn)無(wú)法找到包的問(wèn)題斤儿,可能是網(wǎng)絡(luò)連接問(wèn)題飞盆,從第一步再開(kāi)始即可。
之后融击,可檢查pcl庫(kù)的安裝筑公。輸入:
sudo updatebd
locate pcl
PCL 的頭文件將安裝在/usr/include/pcl-1.7 中,庫(kù)文件位于/usr/lib/中
安裝opencv3.1.0
首先下載opencv3.1.0的源碼: https://github.com/Itseez/opencv/archive/3.1.0.zip
編譯之前尊浪,需要安裝opencv的依賴項(xiàng)
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev
之后進(jìn)入源碼的文件夾進(jìn)行編譯
cd ~/opencv #源碼的文件夾路徑
mkdir build
cd build
cmake ..
make
最后匣屡,不僅僅是編譯,還需要安裝它
sudo make install
測(cè)試代碼:
在kdevelop中打開(kāi)工程拇涤,找到cmakelist.txt和cpp文件的目錄捣作,
選中cmakelist.txt進(jìn)行編譯
cmake_minimum_required( VERSION 2.8 )
project( imageBasics )
# 添加c++ 11標(biāo)準(zhǔn)支持
set( CMAKE_CXX_FLAGS "-std=c++11" )
# 尋找OpenCV庫(kù)
find_package( OpenCV REQUIRED )
# 添加頭文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( imageBasics imageBasics.cpp )
# 鏈接OpenCV庫(kù)
target_link_libraries( imageBasics ${OpenCV_LIBS} )
顯示圖像程序imageBasics.cpp
#include <iostream>
#include <chrono>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main ( int argc, char** argv )
{
// 讀取argv[1]指定的圖像
cv::Mat image;
image = cv::imread ( argv[1] ); //cv::imread函數(shù)讀取指定路徑下的圖像
// 判斷圖像文件是否正確讀取
if ( image.data == nullptr ) //數(shù)據(jù)不存在,可能是文件不存在
{
cerr<<"文件"<<argv[1]<<"不存在."<<endl;
return 0;
}
// 文件順利讀取, 首先輸出一些基本信息
cout<<"圖像寬為"<<image.cols<<",高為"<<image.rows<<",通道數(shù)為"<<image.channels()<<endl;
cv::imshow ( "image", image ); // 用cv::imshow顯示圖像
cv::waitKey ( 0 ); // 暫停程序,等待一個(gè)按鍵輸入
// 判斷image的類型
if ( image.type() != CV_8UC1 && image.type() != CV_8UC3 )
{
// 圖像類型不符合要求
cout<<"請(qǐng)輸入一張彩色圖或灰度圖."<<endl;
return 0;
}
// 遍歷圖像, 請(qǐng)注意以下遍歷方式亦可使用于隨機(jī)像素訪問(wèn)
// 使用 std::chrono 來(lái)給算法計(jì)時(shí)
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++ )
{
// 訪問(wèn)位于 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 指向待訪問(wèn)的像素?cái)?shù)據(jù)
// 輸出該像素的每個(gè)通道,如果是灰度圖就只有一個(gè)通道
for ( int c = 0; c != image.channels(); c++ )
{
unsigned char data = data_ptr[c]; // data為I(x,y)第c個(gè)通道的值
}
}
}
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 );
cout<<"遍歷圖像用時(shí):"<<time_used.count()<<" 秒。"<<endl;
// 關(guān)于 cv::Mat 的拷貝
// 直接賦值并不會(huì)拷貝數(shù)據(jù)
cv::Mat image_another = image;
// 修改 image_another 會(huì)導(dǎo)致 image 發(fā)生變化
image_another ( cv::Rect ( 0,0,100,100 ) ).setTo ( 0 ); // 將左上角100*100的塊置零
cv::imshow ( "image", image );
cv::waitKey ( 0 );
// 使用clone函數(shù)來(lái)拷貝數(shù)據(jù)
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 );
// 對(duì)于圖像還有很多基本的操作,如剪切,旋轉(zhuǎn),縮放等,限于篇幅就不一一介紹了,請(qǐng)參看OpenCV官方文檔查詢每個(gè)函數(shù)的調(diào)用方法.
cv::destroyAllWindows();
return 0;
}
并輸入指令 ../ubuntu.png (..指的是上一目錄)
在終端內(nèi)調(diào)用:(ubuntu.png在build的目錄下)
cd /home/kll/slam/ch5/imageBasics/build
./imageBasics ubuntu.png
(若ubuntu.png在build的上一目錄下)
./imageBasics ../ubuntu.png