opencv入门 - 显示图像学习总结
生活随笔
收集整理的這篇文章主要介紹了
opencv入门 - 显示图像学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV的第一個小程序-讀取圖像并顯示
首先新建一個VC++控制臺項目如下圖所示。本文項目名稱helloOpenCV。
在主文件中添加如下代碼:
#include "stdafx.h"
?
#include <opencv2/opencv.hpp>
?
using namespace std;
using namespace cv;
?
int main(int argc, char* argv[])
{
? ? const char* imagename = "emosue.jpg";
?
? ? //從文件中讀入圖像
? ? Mat img = imread(imagename);
?
? ? //如果讀入圖像失敗
? ? if(img.empty())
? ? {
? ? ? ? fprintf(stderr, "Can not load image %s\n", imagename);
? ? ? ? return -1;
? ? }
?
? ? //顯示圖像
? ? imshow("image", img);
?
? ? //此函數等待按鍵,按鍵盤任意鍵就返回
? ? waitKey();
?
? ? return 0;
}
添加需要打開的圖片到對應目錄本文添加emouse.jpg文件。
編譯運行,結果如下圖所示。
========
OpenCV讀取圖像_顯示圖像和保存圖像
配置好 OpenCV 以后,包含以下兩個頭文件:
#include "cv.h"
#include "highgui.h"
IplImage* image=cvLoadImage("D:\\123.jpg",-1);
//函數cvLoadImage()的第1 個參數是圖像文件的路徑.
//第2 個參數是讀取圖像的方式:-1 表示按照圖像本身的類型來讀取,1 表示強制彩色化,0 表示
//強制灰值化.
if(image==NULL)
{
MessageBox("無法讀取圖像數據!", "提示",MB_OK);//在MFC 工程中這樣用
//若在win32 控制臺程序中,用printf("無法讀取圖像數據!\n");
return;//不作任何操作,就不會執行后面的程序了
}
cvNamedWindow("圖像顯示",CV_WINDOW_AUTOSIZE);
//該函數的功能是按照指定方式創建一個窗口,用于顯示圖像.
//第1 個參數是窗口的名稱,自己可以任意設置
//第2 個參數表示窗口的大小會自動根據圖像尺寸而變化
cvShowImage("圖像顯示",image);
//該函數的功能是在指定的窗口上顯示圖像.
//第1 個參數是顯示圖像窗口的名稱
//第2 個參數是要顯示的圖像
cvSaveImage("D:\\saveImage.jpg",image);
//該函數的功能是將圖像另存為
//第1 個參數是保存的路徑,自己可以設置其它路徑
//第2 個參數是要保存的圖像
cvWaitKey(0);//一直等待按鍵沒有這句的話圖像不能正常顯示
cvReleaseImage(&image);//釋放圖像內存
cvDestroyWindow("圖像顯示");//銷毀窗口資源
//讀取和顯示完圖像之后,要及時釋放所占的內存資源.
運行示例:
========
初試牛刀-OpenCV顯示圖片
一、流程圖
二、函數說明
1、cvLoadImage 打開圖片函數
函數原型:
CVAPI(IplImage*) cvLoadImage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));
返回值類型:Ip1Image*
參數說明:
1)const char* filename 圖片路徑
注意:文件路徑用“\\”而不是“\”
2)int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR) 圖片打開方式,默認是CV_LOAD_IMAGE_COLOR,也就是以彩色形式打開,在OpenCV定義了一些打開方式的
宏,分別為:
宏定義
數值
代表的意義
#define CV_LOAD_IMAGE_UNCHANGED
-1
與原圖保持不變
#define CV_LOAD_IMAGE_GRAYSCALE
0
灰度圖像(單通道)
#define CV_LOAD_IMAGE_COLOR
1
彩色圖像(3通道)(默認值)
#define CV_LOAD_IMAGE_ANYDEPTH
2
任意顏色深度
#define CV_LOAD_IMAGE_ANYCOLOR
4
任意顏色
注意:a、如果想打開方式為原圖形式,也就是默認的,可以不用配置這個參數
b、如果想配置多個值時,用“|”號隔開,例如:“2 |4”
c、如果想要載入最真實的圖片參數設置為CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR
綜合以上說明,函數cvLoadImage就很容易理解,比如
IplImage* img = cvLoadImage(“D:\\lena.jpg”,0);// 以灰度形式打開“D:\lena.jpg”文件
2、cvNamedWindow 創建窗口函數
函數原型:
CVAPI(int) cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) )
返回值類型:int
參數說明:
1)const char* name 窗口的名字,是顯示圖片(cvShowImage)函數中參數
2)int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) 窗口大小設置,有兩種設置,默認是CV_WINDOW_AUTOSIZE
參數值
意義
CV_WINDOW_AUTOSIZE
窗口大小和圖片大小一樣(默認值)
0
窗口固定大小,可以用鼠標調整窗口大小
3、cvShowImage
函數原型:CVAPI(void) cvShowImage( const char* name, const CvArr* image
);
返回值類型:void(無值)
參數說明:
1)const char* name 窗口名,也就是cvNameWindow中創建的窗口
2)const CvArr* image 圖片地址指針,也就是cvLoadImage的返回值
4、cvWaitKey
函數原型:CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));
返回值:int
參數說明:int delay CV_DEFAULT(0)等待時間,單位是毫秒(ms),特殊的,當這個值小于或等于0時,表示等待鍵盤任意鍵退出
5、cvReleaseImage
函數原型:CVAPI(void) cvReleaseImage( IplImage** image );
參數說明:IplImage** image 也就是cvLoadImage的返回值的指針
6、cvDestroyWindow
函數原型:CVAPI(void) cvDestroyWindow( const char* name );
參數說明:const char* name,也就是cvNamedWindow所創建窗口名
三、實現代碼
#include "stdafx.h"
#include "highgui.h"
int main(int argc, char* argv[])
{
// 以灰度形式打開圖片
IplImage* img = cvLoadImage("D:\\lena.jpg",0);
// 創建一個名為“ShowImage1”,大小根據圖片大小
cvNamedWindow("ShowImage1",CV_WINDOW_AUTOSIZE);
// 顯示圖片
cvShowImage("ShowImage1",img);
// 圖片顯示等待3秒
cvWaitKey(3000);
// 釋放圖片內存
cvReleaseImage(&img);
// 銷毀窗口
cvDestroyWindow("ShowImage1");
return 0;
}
========
OpenCV讀取和顯示圖片
一、從文件讀取圖像并顯示1. 程序
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);
if (img.empty())
{
cout << "圖像加載失敗!" << endl;
//system("pause");
return -1;
}
//創建一個名字為MyWindow的窗口
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
//在MyWindow的窗中中顯示存儲在img中的圖片
imshow("MyWindow", img);
//等待直到有鍵按下
waitKey(0);
//銷毀MyWindow的窗口
destroyWindow("MyWindow");
return 0;
}
2. 解釋
#include <opencv2\highgui\highgui.hpp>
imread(), namedWindow(), imshow() 和 waitKey() 函數都聲明在這個頭文件中。
Mat數據結構,它在”opencv2/core/core.hpp”中聲明的,那為什么沒有包含它呢?這是因為在”opencv2/highgui/highgui.hpp”頭文件中已經包含了
core.hpp頭文件,所以不用在我們的程序再次包含了。
using namespace cv;
“opencv2/core/core.hpp” 和 “opencv2/highgui/highgui.hpp中所有的數據結構和函數都聲明在cv命名空間,所以,必須在我們程序的頭部使用它,否則
就要在每個OpenCV的函數和數據結構前面都要加上”cv::”(例如:cv::Mat,cv::imread()等等)。
Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);
Mat是在矩陣中存儲圖片的數據結構,它聲明在 “opencv2/core/core.hpp”頭文件中。
imread()是聲明在 “opencv2/highgui/highgui.hpp”的函數,它從文件加載一個圖片并存儲在Mat數據結構中。
imread()函數的聲明如下:
? ? ? ? CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );
它的參數:
filename —— 文件的位置。如果只提供文件名,那么文件應該和C++文件在同一目錄,否則必須提供圖片的全路徑。
flags —— 有5個可能的輸入。
CV_LOAD_IMAGE_UNCHANGED – 在每個通道中,每個像素的位深為8 bit,通道數(顏色)保持不變。
CV_LOAD_IMAGE_GRAYSCALE – 位深=8 bit 通道數=1(顏色變灰)
CV_LOAD_IMAGE_COLOR -位深=?, 通道數=3
CV_LOAD_IMAGE_ANYDEPTH – 位深不變 ,通道數=?
CV_LOAD_IMAGE_ANYCOLOR – 位深=?, 通道數不變
上面的值還可以組合使用,比如:
CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR – 位深不變,通道數比便
CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH – 位深不變,通道數=3
如果你不確定使用哪個,就是用CV_LOAD_IMAGE_COLOR 。
要理解位深和通道的概念,應該熟悉圖像處理的理論知識,所以下面討論一點這方面的內容。
所有的數字圖像都是由像素組成的,所有的像素都有值。一個像素的最小值為0,表示黑色。像素的值變大,它的亮度也會增強。每個像素分配的比特的固定
數值是255(十進制),也就是說每個像素分配8個bit。所以一個像素的最大值為255(二進制為11111111)。
那么什么是位深呢?位深就是為每個像素分配的比特。如果比特是8,每個像素的值可以是0-255。如果是4,每個像素的值可是0-15(二進制中為1111)。
下面是一個8 bit位深的圖片的簡單模型。每個小矩形表示一個像素。所以每個矩形包含一個0-255的值。
GrayscaleImage
這張圖像的一些屬性:
8 bit位深
一個通道(所以這是一個灰度圖像)
高為4px
寬為5px
分辨率為4×5
這是一個灰度圖像(黑白圖像),因為該圖像沒有顏色內容。像素的值越高,圖像就會越亮。像素值越低,圖像就會越暗。
下面是一個彩色圖像的簡單模型。彩色圖像至少包含3個平面:Red,Green和Blue。使用這3種顏色的特定組合可以創建任何顏色。所有的像素都是這3種顏色
值的組合。(255,0,0)表示pure red。(0,255,0)表示pure green。(255,0,255)表示pure violate。它的位深為24,因為每個像素為8×3 bit (每個通
道8 bit)。
ColorImage
這張圖像的一些屬性:
位深24 bit
3個通道(所以是彩色圖像)
高4px
寬5px
分辨率為4×5
上面的模型,左上角的像素是(23,231,46)。它會顯示為呈綠色的顏色,因為green值(231)比red(23)和blue(46)都大。
if (img.empty())
如果imread()函數加載圖像失敗,’img’不會加載任何數據,因此,img.empty()應該返回true。檢查是否成功加載,如果沒有則退出程序是一個好的做法,
否則當調用imshow()函數時,程序就會崩潰。
bool Mat::empty()
如果Mat::data==NULL或Mat::total()==0,這個函數返回true。
system("pause");
如果使用Visual Studio,這行注釋的注釋最好取消,因為它會暫停程序,知道用戶按下任意鍵。如果不取消注釋,程序會立即退出,用戶也就不會看到錯誤
信息了。
void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
這個函數創建一個窗口。它的參數如下:
winname——窗口的名字。這個名字會顯示在窗口的標題欄上。
flags——決定窗口的尺寸。有如下選項:
WINDOW_AUTOSIZE – 用戶不能改變圖像的尺寸,圖像顯示為它的原有尺寸
CV_WINDOW_NORMAL – 調整窗口圖像的尺寸可以改變
void imshow(const string& winname, InputArray mat);
這個函數在指定名字的窗口中顯示存儲在mat中的圖像。如果窗口使用WINDOW_AUTOSIZE創建的,圖像會顯示為它的原始尺寸,否則圖像會調整到窗口的尺寸大
小。
它的參數:
winname -窗口的名字。這個名字是namedWindow()函數創建窗口時使用的
mat – 存儲圖像數據的Mat對象
? ? ? ? int waitKey(int delay = 0)
waitKey()函數通過指定delay(毫秒)等待按鍵的時間。如果delay是0或負數,它會永久等待。如果任意鍵被按下,這個函數就會返回按下鍵的ASCII值,程序
繼續執行。如果指定的時間沒有按下鍵,它返回-1,程序繼續執行。
void destroyWindow(const string& winname)
這個函數關閉名字為winname的打開的窗口并釋放關聯的內存。這個函數對這個程序來說不是必須的,因為當程序退出,操作系統通常會關閉所有打開的窗口
并釋放關聯的內存。
二、創建一個空圖像并顯示
這個程序創建了一個空圖像,而不是從文件中加載已存在的圖像。
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
Mat img(500, 1000, CV_8UC3, Scalar(0, 0, 100)); //創建一個圖像 ( 3個通道, 8 bit位深, 高500, 寬1000, (0, 0, 100) 分別分配給 Blue,?
Green and Red. )
if (img.empty())
{
cout << "圖像不能加載!" << endl;
//system("pause");
return -1;
}
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", img);?
waitKey(0);
destroyWindow("MyWindow");?
return 0;
}
Mat::Mat(int rows, int cols, int type, const Scalar& s);
這是Mat的一個構造函數。它使用Scalar對象給定的值初始化Mat對象。
它的參數:
rows – 2維矩陣的行數 (圖像的高度像素)
cols – 2維矩陣的列數 ( 圖像的寬度像素)
type – 指定圖像的位深,數據類型和通道數。我提供 CV_8UC3 ,指定3個通道的8 bit無符號整數,下面是這個參數一些可能的輸入值:
CV_8UC1 – 單通道8 bit無符號整數
CV_8UC3 – 3通道8 bit為無符號整數
CV_64FC1 – 單通道64 bit 浮點數
s – 使用s給定的值初始化矩陣的每個元素。在上面的程序中,給定Scalar(0,0,100),因此,它使用0初始化第一個通道(Blue),0初始化第二個通道
(Green),100初始化第三個通道(Red)。所以,最終的圖像是red。
在這個程序中,創建了一個高500,寬1000,有3個通道的圖像。每個通道的每個像素分配8 bit的無符號整數(每個像素 8×3=24 bit),每個像素使用
(0,0,100)指定值。這意味著,第一個通道總是0,第二個通道也總是0,第三個通道總是100,因此,最終看到的是一個red的圖像。
========
opencv 圖像顯示IplImage
圖像顯示的origin屬性改變 (原點的改變)#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
?
int main(int argc, char* argv[]){
??
? IplImage* img;
? img=cvLoadImage("d://1.jpg");
? //原點顯示 默認值 0:左上角是原點 1:左下角是原點
? img->origin=1;
? //輸出圖像通道數 3通道圖像RGB模式
? printf("nChannels is %d",img->nChannels);
? cvNamedWindow("1");
? cvShowImage("1",img);
? cvWaitKey(0);
? return 0;
}
三個顏色通道分割顯示:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
?
int main(int argc, char* argv[])
{
? ? ? ? IplImage* img , *sub_img;
? ? ? ? int y,x;
? ? ? ? //加載圖像1.jpg
? ? ? ? img = cvLoadImage("d:\\1.jpg");
? ? ? ??
? ? /* ? 將3通道圖像 分解成 3幅單通道的圖像 */
? ? ? ??
? ? ? ? //聲明三個圖像變量
? ? ? ? IplImage* b_img ,*g_img,*r_img;
?
? ? ? ? //給三個單通圖像 分配內存空間
? ? ? ? b_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
? ? ? ? g_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
? ? ? ? r_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
?
? ? ? ? for(y=0;y<img->height;y++)
? ? ? ? {
? ? ? ? ? ? ? ? //將圖像指針偏移到第y行
? ? ? ? ? ? ? ? unsigned char* prow = (unsigned char*)( ?img->imageData + y* ?img->widthStep);
? ? ? ? ? ? ? ? unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);
? ? ? ? ? ? ? ? unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);
? ? ? ? ? ? ? ? unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);
? ? ? ? ? ? ? ? for(x=0;x<img->width;x++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? //將B通道 ?G通道 ?R通道的值 分別拷貝到3個單通道的圖像中去
? ? ? ? ? ? ? ? ? ? ? ? brow[x] = prow[3*x + 0] ; //拷貝B通道的值prow[3*x + 0] 到 單通道圖像b_img
? ? ? ? ? ? ? ? ? ? ? ? grow[x] = prow[3*x + 1] ; //拷貝G通道的值prow[3*x + 0] 到 單通道圖像b_img
? ? ? ? ? ? ? ? ? ? ? ? rrow[x] = prow[3*x + 2] ; //拷貝R通道的值prow[3*x + 0] 到 單通道圖像b_img
? ? ? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //創建3個窗口
? ? ? ? cvNamedWindow("b");
? ? ? ? cvNamedWindow("g");
? ? ? ? cvNamedWindow("r");
? ? ? ? //顯示b ?g r三個通道的圖像
? ? ? ? cvShowImage("b" , b_img);
? ? ? ? cvShowImage("g" , g_img);
? ? ? ? cvShowImage("r" , r_img);
?
? ? ? ? //顯示大圖像
? ? ? ? cvNamedWindow("1");
? ? ? ? cvShowImage("1",img);
? ? ? ? //等待按鍵
? ? ? ? cvWaitKey(0);
?
? ? ? ? //釋放內存空間
? ? ? ? cvReleaseImage(&img);
? ? ? ? return 0;
?
}
========
OpenCV2 圖像的載入與顯示
OpenCV的接口包括C++,C,Python的
我用MinGW編譯OpenCV2.1 和 OpenCV2.2 從未成功過
前幾日發現 OpenCV 2.3發布,下載了自解壓程序,解壓后又visual studio 2008,2010和MinGW版的
但其中的MinGW版的是官方 MinGW的,我使用的是在 http://nuwen.net/mingw.html 下載的
編譯程序連接時總出錯,于是下載了源碼包,編譯后能正常使用
先來看看最簡單的圖像的載入與顯示,使用C++接口
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(){
? ? Mat image = imread("E:/Image/Lena.jpg");
? ? namedWindow("MyPicture");
? ? imshow("MyPicture",image);
? ? waitKey(0);
? ? return 0;
}
========
opencv顯示圖像
#include "highgui.h"using namespace cv;
using namespace std;
?
int main()
{
? ? IplImage *img = cvLoadImage("airplane.png");
? ? cvNamedWindow("1");
? ? cvShowImage("1",img);
? ? cvWaitKey(0);
? ? cvReleaseImage(&img);
? ? cvDestroyWindow("1");
?
}
一些解釋:
1.cvNamedWindow函數:
? cvNameWindow(“Example”,CV_WINDOW_AUTOSIZE);
? ? 用于在屏幕上創建一個窗口,將被顯示的圖像包含于該窗口中
? ? 第一個參數:窗口標題
? ? 第二個參數:窗口的屬性 默認為0(圖像根據窗口的大小進行縮放)
2.cvLoadImage(const char * filename,int iscolor=1);
? ? ?有兩個輸入參數:
? ? ?第一個參數:圖像路徑
? ? ?第二個參數:iscolor默認值為1,顯示彩色圖像,iscolor設置為0,表示顯示黑白圖像。
========
在vs2012中用opencv顯示圖像
? ?如何用opencv2.44在VS2012中顯示一幅彩色圖像,并提取其灰度值,
VS2012+opencv2.44+win7.8
方法/步驟
1
第一步,這副圖片是我們將要用來顯示的圖片
2
第二步,將相關庫文件庫加進去,包括利用opencv顯示的庫,
3
第三步,先要讀入圖片文件的地址,
然后將讀入的地址給MAT類,讀兩次,一次給灰度圖像用,另一次給彩色
圖像用,下面用一個IF不判斷出錯的處理情況
4
第四步,創建顯示窗口,前面參數是窗口名,后面的1表示圖像不可縮放,創建一個灰度窗口和一個彩色窗口
5
第五步,將圖像在創建的窗口中顯示,第一參數是顯示的窗口名,第二個參數是我們先讀入的MAT圖像,后面是按鍵返回
6
第六步,按上述代碼完成后,成功顯示圖像
========
總結
以上是生活随笔為你收集整理的opencv入门 - 显示图像学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv视频处理和检测学习总结
- 下一篇: opencv 图像去噪要点总结