下面的程式是書里的源代碼,其中
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv4/opencv2/core/core.hpp>
//#include <opencv4/opencv2/highgui/highgui.hpp>
可以用這兩種方式,具體看能不能編譯成功,如果有報錯的話可以用下面這種方式,
#include <iostream>
#include <chrono>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv4/opencv2/core/core.hpp>
//#include <opencv4/opencv2/highgui/highgui.hpp>
int main(int argc, char **argv) {
// 讀取argv[1]指定的影像
cv::Mat image;
image = cv::imread(argv[1]); //cv::imread函式讀取指定路徑下的影像
// 判斷影像檔案是否正確讀取
if (image.data == nullptr) { //資料不存在,可能是檔案不存在
cerr << "檔案" << argv[1] << "不存在." << endl;
return 0;
}
// 檔案順利讀取, 首先輸出一些基本資訊
cout << "影像寬為" << image.cols << ",高為" << image.rows << ",通道數為" << image.channels() << endl;
cv::imshow("image", image); // 用cv::imshow顯示影像
cv::waitKey(0); // 暫停程式,等待一個按鍵輸入
// 判斷image的型別
if (image.type() != CV_8UC1 && image.type() != CV_8UC3) {
// 影像型別不符合要求
cout << "請輸入一張彩色圖或灰度圖." << endl;
return 0;
}
// 遍歷影像, 請注意以下遍歷方式亦可使用于隨機像素訪問
// 使用 std::chrono 來給演算法計時
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
for (size_t y = 0; y < image.rows; y++) {
// 用cv::Mat::ptr獲得影像的行指標
unsigned char *row_ptr = image.ptr<unsigned char>(y); // row_ptr是第y行的頭指標
for (size_t x = 0; x < image.cols; x++) {
// 訪問位于 x,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;
// 修改 image_another 會導致 image 發生變化
image_another(cv::Rect(0, 0, 100, 100)).setTo(0); // 將左上角100*100的塊置零
cv::imshow("image", image);
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);
// 對于影像還有很多基本的操作,如剪切,旋轉,縮放等,限于篇幅就不一一介紹了,請參看OpenCV官方檔案查詢每個函式的呼叫方法.
cv::destroyAllWindows();
return 0;
}
CMakeLists.txt如下:
需要對原來的txt進行修改:
project(imageBasics)
cmake_minimum_required(VERSION 3.10)
add_executable(imageBasics imageBasics.cpp)
# 鏈接OpenCV庫
find_package( OpenCV REQUIRED )
#添加頭檔案
include_directories( ${OpenCV-INCLUDE_DIRS})
target_link_libraries(imageBasics ${OpenCV_LIBS})
add_executable(undistortImage undistortImage.cpp)
# 鏈接OpenCV庫
target_link_libraries(undistortImage ${OpenCV_LIBS})
set(CMAKE_CXX_FLAGS "-std=c++11")
編譯的步驟還是一樣:進入imageBasics檔案夾:
mkdir build
cd build
cmake ..
make -j4
編譯成功后,執行下面的命令,和書上的命令稍微不一樣,如果直接執行或者輸入書上的命令,就會報錯!在build檔案夾下執行
./imageBasics ../ubuntu.png
輸入指令后,執行效果如下圖所示:

Ubuntu20.04和18.04都可以編譯成功,我已經在兩個版本上編譯過!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296780.html
標籤:其他
