這個圖說明了很多問題。畢竟是知識樹,把知識面都展示地很清楚,要學的東西真特麼多。
先把簡單的作業2貼上來吧,畢竟簡單。
題目2
已知相機的位姿用四元數表示爲q=[0.35,0.2,0.3,0.1],順序爲x,y,z,w,請編程實現:
輸出四元數對應的旋轉矩陣、旋轉矩陣的轉置,旋轉矩陣的逆矩陣,旋轉矩陣乘以自身的轉置,驗證旋轉矩陣的正交性。
初始化順序的是 w,x,y,z。
本程序學習目的:
熟悉cmake的使用、學習eigen的基本操作;根據實踐驗證旋轉矩陣的約束
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Geometry>
int main(int argc, char **argv) {
Eigen::Quaterniond quat(0.1,0.35,0.2,0.3);
quat.normalize();
std::cout<<quat.matrix()<<std::endl;
Eigen::Matrix3d Rotation = quat.toRotationMatrix();
std::cout<<Rotation<<std::endl;
Eigen::Matrix3d RotationT = Rotation.transpose();
std::cout<<RotationT<<std::endl;
Eigen::Matrix3d RotationI = Rotation.inverse();
std::cout<<RotationI<<std::endl;
std::cout<<Rotation*RotationT<<std::endl;
return 0;
}
補充點東西:
比較簡單,需要注意的點:
- 四元數的初始化
- 四元數使用前一定要歸一化
- 引入Eigen模塊 #include <Eigen/Core>
看下CMakeList.txt:
cmake_minimum_required(VERSION 2.6)
project(homework2)
include_directories("/usr/include/eigen3")
add_executable(homework2 main.cpp)
install(TARGETS homework2 RUNTIME DESTINATION bin)
要注意的點:
- include_directories要在add_executable之前
- Eigen僅由頭文件組成,不需要鏈接庫
- Eigen頭文件默認在 /usr/include/eigen3
題目1
我們知道SLAM是處理序列圖像的,有時候需要格式化的圖像名字用作輸入。前面提到的TUM的RGB-D數據集中圖像是根據時間命名的,請從下面鏈接下載數據集fr1/desk
https://vision.in.tum.de/data/datasets/rgbd-dataset/download#
並解壓。請編程實現將文件夾/rgb下以時間命名的序列圖片重新命名爲0000-9999的格式。
本程序學習目的:
熟悉cmake的使用、OpenCV讀寫操作、C++的string操作
代碼:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char **argv) {
cv::String path = "/home/weiyanzhi/projects/homework1/rgbd_dataset_freiburg1_desk/rgb/";//待處理圖片路徑
cv::String dest = "/home/weiyanzhi/projects/homework1/rgbd_dataset_freiburg1_desk/rgb/";//保存處理後的圖片路徑
cv::String savefilename;
vector<cv::String> filenames;
cv::Mat srcImg,dstImg;
cv::glob(path,filenames);//glob將路徑裏面的圖片讀入到vector上
//void cv::glob ( String pattern,std::vector< String > & result,bool recursive = false),原函數的聲明
for(int i = 0;i<filenames.size();++i)
{
srcImg = cv::imread(filenames[i]);
srcImg.copyTo(dstImg);
if(i<10)
{
savefilename = dest+"000"+std::to_string(i)+".png"; //cv::String的拼接
cv::imwrite(savefilename,dstImg); //保存路徑+圖片
}
if(i>=10&&i<99)
{
savefilename = dest+"00"+std::to_string(i)+".png";
cv::imwrite(savefilename,dstImg);
}
if(i>=100&&i<999)
{
savefilename = dest + "0"+to_string(i)+".png";
cv::imwrite(savefilename,dstImg);
}
if(i>=1000&&i<9999)
{
savefilename = dest + to_string(i)+".png";
cv::imwrite(savefilename,dstImg);
}
}
return 0;
}
這個有幾個注意點:
- cv::String用法和std::string差不多,初始化方式見識一下
- cv::glob用法瞭解一下,這個是解決問題的關鍵
看下CMakeList.txt:
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_FLAGS "-std=c++11 -O2")
project(homework1)
# 尋找OpenCV庫
find_package(OpenCV REQUIRED)
# 添加頭文件
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(homework1 main.cpp)
target_link_libraries(homework1 ${OpenCV_LIBS})
install(TARGETS homework1 RUNTIME DESTINATION bin)
注意的點:
- OpenCV 的find_package用法 find_package(OpenCV REQUIED)
- OpenCV添加頭文件 include_directories(${OpenCV_INCLUDE_DIRS})
- OpenCV鏈接庫文件 target_link_libraries(目標文件 ${OpenCV_LIBS})