本系列的目的是詳解demo代碼,快速學習OpenCV相關操作
平滑處理
//平滑處理
//指定輸入圖像,進行平滑操作後輸出
#include <opencv2/opencv.hpp>
void example2_5( const cv::Mat & image ) {
//創建兩個窗口顯示輸入和輸出的圖像
cv::namedWindow( "Example2_5-in", cv::WINDOW_AUTOSIZE );
cv::namedWindow( "Example2_5-out", cv::WINDOW_AUTOSIZE );
// 在窗口中顯示輸入圖像
cv::imshow( "Example2_5-in", image );
// 創建一個圖像來保存平滑後的輸出圖像
cv::Mat out;
// ( 可以使用不同的平滑算子 GaussianBlur(), blur(), medianBlur() or bilateralFilter(). )
// 對image每個像素周圍5*5的區域進行高斯平滑處理,寫入out
cv::GaussianBlur( image, out, cv::Size(5,5), 3, 3);
// 對out進行相同的高斯處理,再寫入out
// 這一步是爲了說明輸入、輸出圖像可以是相同的,這種情況下會根據所需自動臨時分配內存
cv::GaussianBlur( out, out, cv::Size(5,5), 3, 3);
// 在輸出窗口顯示平滑後的圖像
cv::imshow( "Example2_5-out", out );
// 等待用戶鍵盤輸入任意鍵退出程序
cv::waitKey( 0 );
}
縮放處理
//縮放處理(降採樣和上採樣)
//使用cv::pyrDown()函數創建一幅高度和寬度爲輸入圖像一半尺寸的圖像
#include <opencv2/opencv.hpp>
int main( int argc, char** argv ) {
cv::Mat img1,img2;
cv::namedWindow( "Example1", cv::WINDOW_AUTOSIZE );
cv::namedWindow( "Example2", cv::WINDOW_AUTOSIZE );
img1 = cv::imread( argv[1] );
cv::imshow( "Example1", img1 );
//img1爲輸入圖像,img2爲輸出圖像
cv::pyrDown( img1, img2);
cv::imshow( "Example2", img2 );
cv::waitKey(0);
return 0;
};
Canny邊緣檢測
//Canny邊緣檢測
//Canny邊緣檢測將輸出寫入單通道(灰度)圖像
#include <opencv2/opencv.hpp>
int main( int argc, char** argv ) {
cv::Mat img_rgb, img_gry, img_cny;
cv::namedWindow( "Example Gray", cv::WINDOW_AUTOSIZE );
cv::namedWindow( "Example Canny", cv::WINDOW_AUTOSIZE );
img_rgb = cv::imread( argv[1] );
// 將rgb三通道圖像轉換爲單通道(灰度級)圖像
// 因爲Canny算子只能處理灰度圖
cv::cvtColor( img_rgb, img_gry, cv::COLOR_BGR2GRAY);
cv::imshow( "Example Gray", img_gry );
//利用Canny算子進行邊緣檢測
//參數分別爲 輸入圖像,輸出圖像,低閾值,高閾值,Sobel算子內核大小
//低閾值用來控制邊緣連接,高的閾值用來控制強邊緣的初始分割
cv::Canny( img_gry, img_cny, 10, 100, 3, true );
cv::imshow( "Example Canny", img_cny );
cv::waitKey(0);
}
獲取和設置像素
//獲取和設置像素
//設置要讀取的座標點
int x = 16, y = 32;
// Vec3b代表8U類型的RGB彩色圖像,三維數組,用法類似Vector
//.at(int y, int x)函數可以用來存取圖像中對應座標爲(x,y)的元素座標
//.at是用模板函數實現的
cv::Vec3b intensity = img_rgb.at< cv::Vec3b >(y, x);
//賦值就可以完成設置像素操作
uchar blue = intensity[0];
uchar green = intensity[1];
uchar red = intensity[2];
std::cout << "At (x,y) = (" << x << ", " << y <<"): (blue, green, red) = (" <<(unsigned int)blue <<", " << (unsigned int)green << ", " <<(unsigned int)red << ")" << std::endl;
std::cout << "Gray pixel there is: " <<(unsigned int)img_gry.at<uchar>(y, x) << std::endl;
x /= 4; y /= 4;
std::cout << "Pyramid2 pixel there is: " <<(unsigned int)img_pyr2.at<uchar>(y, x) << std::endl;
img_cny.at<uchar>(x, y) = 128; // Set the Canny pixel there to 128