2010年11月26日 星期五

在DEV-C++環境使用OpenCV-2.1.0-win32-vs2008計算PSNR範例[程式碼篇]

在DEV-C++環境
使用OpenCV
計算PSNR範例

環境:
DEV-C++ :devcpp-4.9.9.2_setup.exe
opencv :OpenCV-2.1.0-win32-vs2008.exe


上次提到

上網 Google一下

------------------------------------------------------------------

網友patrick

OPENCV PSNR计算方法

http://quntingyang.spaces.live.com/blog/cns!531ADA1CF4C7FF2E!272.entry

------------------------------------------------------------------

カクタス榎木

------------------------------------------------------------------


都有寫好的範例

而且還好心的函式化了

想要快速使用

接呼叫(call function)或改寫成主程式(main)都是不錯的好方法

要惡補OpenCV語法的
可以在本系學長的 "昨日OpenCV"網站溫習一下

昨日OpenCV:
http://yester-place.blogspot.com/


所以本次就來完補啦

立即撰寫一個範例

函式再度改回主程式(main)

本範例改寫
網友patrick

OPENCV PSNR计算方法

先奉上程式碼,可以看註解,後面有補說明






解說之彩色網頁程式碼轉換顯示 使用: c# code format 網站









#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
int main()
{
double totalValue=0;
double psnr=0.0;
IplImage *srcImage = cvLoadImage("House512.BMP",1);
IplImage *dstImage = cvLoadImage("House5122.BMP",1);


int NR(srcImage->height),NC(srcImage->width);
if (srcImage->width!=dstImage->width||srcImage->height!=dstImage->height)
{
std::cout<<"usage: Two images must have same size!"<<std::endl;
return FALSE;
}else if (srcImage->nChannels!=dstImage->nChannels)
{
std::cout<<"usage:Two images must have same channels\n 1 dimension\n 3 dimension\n";
return FALSE;
}
//若圖片是灰階,直接算totalValue
else if (srcImage->nChannels==1||dstImage->nChannels==1)
{
for (int i=0;i<NR;i++)
{
for (int j=0;j<NC;j++)
{
double s1 = cvGetReal2D(srcImage,i,j);//取得像素值
double s2 = cvGetReal2D(dstImage,i,j);
double sub = s1-s2;
totalValue +=pow(sub,2);
}
}

}
//若圖片是彩色,先轉灰階後,計算totalValue
else if(srcImage->nChannels==3||dstImage->nChannels==3)
{
IplImage *srcData = 0, *dstData= 0;
srcData = cvCreateImage( cvSize(NR, NC), IPL_DEPTH_8U, 1 );
dstData = cvCreateImage( cvSize(NR, NC), IPL_DEPTH_8U, 1 );
cvCvtColor(srcImage,srcData,CV_BGR2GRAY);
cvCvtColor(dstImage,dstData,CV_BGR2GRAY);
for (int i=0;i<NR;i++)
{
for (int j=0;j<NC;j++)
{
double s1 = cvGetReal2D(srcData,i,j);//取得像素值
double s2 = cvGetReal2D(dstData,i,j);
double sub = s1-s2;
totalValue +=pow(sub,2);
}
}

}
if (fabs(totalValue) < 1e-6)
{
psnr = 0;
}
else
{
double meanValue = totalValue/(NR*NC);
psnr = 10*log((255*255)/meanValue);
}
printf("\n計算PSNR為:%f\n",psnr);
system("pause");
//return TRUE;

}






■引用說明:
#include //宣告IplImage所需
#include //宣告 cvLoadImage 所需

■宣告說明:
IplImage //OpenCV Image物件 ;物件化圖片,並給予結構如之後有用到的 ->height、->width


■OpenCV函式說明:

cvLoadImage
/* OpenCV 載入圖片函式 結構為CVAPI(IplImage*) cvLoadImage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)); */

cvGetReal2D(Image物件,i,j);//取得像素值
/* 是取得Image物件裡面(row,column)
*/

■變數說明:
nChannels // ==1 是灰階; ==3是全彩
1e-6 //我們通常會用一個不合理的狀況作為例外排除,而通常是使用-1或1e-6

■C++基本語法...
std::cout<<"X"<<std::endl //印X

2010年11月7日 星期日

在DEV-C++環境使用OpenCV-2.1.0-win32-vs2008計算PSNR範例[環境設定篇]



在DEV-C++環境
使用OpenCV
計算PSNR範例


環境:
DEV-C++ :devcpp-4.9.9.2_setup.exe
opencv :OpenCV-2.1.0-win32-vs2008.exe



很久沒有Open CV了,倒是很長Open GL

稍稍整理了網路上的OpenCV教學

發現新版OpenCV-2.1.0-win32-vs2008.exe

剛好學弟們在修影像處理

快速解決一下他們的疑難雜症

首先是

OpenCV-2.1.0-win32-vs2008.exe安裝教學


設定

我們將假設OpenCV是安裝在C:\Program Files\OpenCV的 目錄。

首先,選擇 工具“>編譯器選項。



然後點綠色的 加號 標誌
添加一個新的編譯器,並命名為 OpenCV





完成後,

之前舊版OpenCV 是添加...

-L"C:\Program Files\OpenCV\lib" -lcxcore -lcv -lcvaux -lhighgui -lml -lcvcam

openCVOptions.jpg


但新版OpenCV 2.1 請填:


-L"C:\OpenCV2.1\lib" -lcxcore210 -lcv210 -lcvaux210 -lhighgui210 -lml210

Include files的設定

接下來,點擊 目錄 ,

然後在 C Include files 添加

C:\Program Files\OpenCV2.1\include\opencv



當然,如果你想編寫C + +程序,

在 C + + Include files 再同樣做一次



函式庫的設定


對於OpenCV2.x沒有 otherlibs \ highgui 文件夾

因此只需添加 C:\Program FIles\OpenCV2.x\bin 就足夠了。



動態庫文件的配置

並完成,添加的bin目錄下的DLL:


測試


讓我們選擇一個C程式在 OpenCV的 samples目錄中 ,

並嘗試執行它,按下鍵盤 F9鍵。 正如你所看到的,編譯過了。

compileProgress.jpg

範例目錄:C:\OpenCV2.1\samples


上網 Google一下

------------------------------------------------------------------

網友patrick

OPENCV PSNR计算方法

http://quntingyang.spaces.live.com/blog/cns!531ADA1CF4C7FF2E!272.entry

------------------------------------------------------------------

カクタス榎木

------------------------------------------------------------------


都有寫好的範例

而且還好心的函式化了

想要快速使用

接呼叫(call function)或改寫成主程式(main)都是不錯的好方法

要惡補OpenCV語法的
可以在本系學長的 "昨日OpenCV"網站溫習一下

昨日OpenCV:
http://yester-place.blogspot.com/



孩子們 加油吧!

送佛送到中間,西天要自己去,阿!是西經要自己取啦....

別再說Google咕不到了....

熱門文章