OpemCV 图片读取、显示、存储(imread、imshow、imwrite)

OpenCV图像处理入门
本文介绍了如何使用OpenCV进行图像处理的基本操作,包括图像的读取、显示、保存等,并提供了具体的代码示例。

   读取文档等之前注意加入OpenCV的头文件以及预先配置好的环境,前面章节有讲到与Qt的环境配置

  

    图片读取   

Mat imread(const string& filename, int flags=1)

  • filename:读取文件路径和名称。

  • flags:图片标志,flag分成三種模式,分別為彩色、灰階、原影像格式。

     

    flag值

    備註

    CV_LOAD_IMAGE_UNCHANGED

    <0

    讀入格式不變

    CV_LOAD_IMAGE_GRAYSCALE

    0

    以灰階讀入

    CV_LOAD_IMAGE_COLOR

    >0

    以BGR格式讀入

OpenCV支援的影像格式有BMP、PBM、DIB、JPEG、JPE、PNG、TIF等,常見的格式幾乎都有支援,以下的程式碼讀入"lena.jpg",並賦值給img:

Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);

創建視窗

void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE)

  • winname:視窗標題。

  • flags:視窗標誌,flag常用的有兩種,分別為WINDOW_NORMAL和WINDOW_AUTOSIZE,當使用WINDOW_NORMAL時,可變更視窗的大小,當使用WINDOW_AUTOSIZE時,會產生剛好包含Mat大小的視窗,無法改變視窗大小。

秀出影像

void imshow(const string& winname, InputArray mat)

  • winname:要秀出此影像的視窗。

  • mat:要秀出的影像,當Mat為8位元時直接秀出,16位元時數值除以256後秀出,為浮點數時乘上255,使得三種格式,顯現範圍都為0~255。

我們先創建視窗,接著將Mat秀在此視窗內,當我們使用imshow這個函式時,我們需要加上waitKey(0),阻斷程式進行,這樣才可以看到視窗,以及視窗內的圖像,直到按下任一鍵後程式才繼續進行。如果流程完全不阻斷,main函式隨之進行完畢,此時視窗和影像都消失,我們會看不到想要的結果,以下為秀出影像的程式碼:

namedWindow("Display window", WINDOW_AUTOSIZE); 
imshow("Display window", img);  
waitKey(0);

等待按鍵輸入

int waitKey(int delay=0)
  • delay:等待時間,這邊主要分兩大類使用方式,當delay<=0時,程式靜止,當delay>0時,函式會等待參數時間(ms)後,返回按鍵的ASCII碼,如果這段時間沒有按鍵按下,會返回-1。

  • waitKey()只有搭配OpenCV視窗才有效果,沒有視窗的話無此暫停程式功能。

  • 可以使用這個特性搭配while迴圈,讓圖片不斷顯示,直到按下某特定按鍵後才停止。

由於esc鍵的ASCII碼為27,所以以下程式只有按下esc鍵,程式才會跳出迴圈:

while(true){ 
    imshow("Display window", img);  
    if(cvWaitKey(10)==27){  
        break; 
    } 
}

圖片儲存

bool imwrite(const string& filename, InputArray img, const vector& params=vector())

  • filename:儲存的檔案名稱。

  • img:要儲存的影像。

  • params:影像參數,以(id,value)的順序輸入,因為有些格式有參數可輸入,像JPEG壓縮品質的值從0到100,預設為95,我們可將CV_IMWRITE_JPEG_QUALITY設定值,進而改變儲存的JPEG影像品質。

  • 如果是儲存3通道彩色圖的話,要注意此時的色彩空間需為BGR,否則後續讀取強度會錯誤,B和R的強度會對調。

OpenCV支援的影像格式有BMP、PBM、DIB、JPEG、JPE、PNG、TIF等,常見的格式幾乎都有支援,以下為圖片儲存的程式碼:

imwrite ("output1.jpg ", img);
vector<int> quality;
quality.push_back(CV_IMWRITE_JPEG_QUALITY);
quality.push_back(90);
imwrite("output2.jpg", img, quality);

程式範例1

以下程式碼從硬碟讀取檔案,將影像設定成灰階圖,把影像儲存在硬碟,並將影像秀在螢幕上,當使用者按下任一鍵,或是關閉視窗後程式終止:

#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(){
    Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    imwrite("output.jpg",img);  

    namedWindow("Display window", WINDOW_AUTOSIZE);  
    imshow("Display window", img);        
    waitKey(0);                          

    return 0;
}

程式範例2

以下程式碼從硬碟讀取檔案,秀在螢幕上,當使用者按下esc鍵時程式終止:

#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(){
    Mat img = imread("lena.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    while(true){
        imshow("Display window", img);     
        if(cvWaitKey(10)==27){                      
            break;
        }
    }
    return 0;
}

imshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落寞的雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值