在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计算方法
先奉上程式碼,可以看註解,後面有補說明
#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
沒有留言:
張貼留言
選擇[匿名]選項可直接留言