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

熱門文章