2009年7月14日 星期二

HW 6-7

#include

#include

#include "cv.h" // include core library interface

#include "highgui.h" // include GUI library interface

void CMainFrame::OnResize()

{ IplImage * img = NULL; //建立一IplImage之指標變數並設值為NULL

IplImage * pImage = NULL; //建立一IplImage之指標變數並設值為NULL

IplImage * pImgNew = NULL; //建立一IplImage之指標變數並設值為NULL img=cvLoadImage("img.jpg"); //img.jpg讀入圖片

pImage = cvCloneImage(img); //複製一份img

CFileDialog dlg(TRUE,_T("*.bmp"),"",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,"image files(*.bmp;*.jpg)|*,bmp;*.jpg|AVI files(*.avi)|*.avi|All Files(*.*)|*.*||",NULL);

char title[]={"Open Image again"};

dlg.m_ofn.lpstrTitle = title;

if(dlg.DoModal() == IDOK)

{

imgfilepath = dlg.GetPathName();

if(pImgNew != 0)

cvReleaseImage(&pImgNew); ///pImaNew之圖片釋放

pImgNew = cvvLoadImage(imgfilepath); //載入第二幅圖像

cvvNamedWindow("Second Image",1); //創立並顯示第二幅圖象名稱為Second Image

cvvShowImage("Second Image",pImgNew); //顯現出pImgNew的圖片

/*cvv開頭的是highgui的函數。為了用ImageProcessor,將此頭文件包入對話框。一旦文件打開,一個ImageProcessor的實例即被創建*/

}

cvResize(pImage,pImgNew,CV_INTER_NN);

cvvNamedWindow("Resized Image",1); //創立視窗名稱為Resized Image

cvvShowImage("Resized Image",pImgNew); //顯現出pImgNew的圖片

cvWaitKey(0); //等待key按下之時間(<=0為無線等待)

cvReleaseImage(&pImage); //pImage之圖片釋放

cvReleaseImage(&pImgNew); //pImaNew之圖片釋放

cvDestroyWindow("Second Image"); //銷毀Second Image窗口

cvDestroyWindow("Resized Image"); //銷毀Resized Image窗口

}

void CMainFrame::OnRotation()

{

int angle = 30; //設定旋轉角度三十度

int opt = 0; //1加縮放 =0 僅旋轉

double factor; //宣告factor

IplImage * img = NULL; //建立一IplImage之指標變數並設值為NULL

IplImage * pImage = NULL; //建立一IplImage之指標變數並設值為NULL

IplImage * pImgRotation = NULL; //建立一IplImage之指標變數並設值為NULL

img=cvLoadImage("img.jpg"); //img.jpg讀入圖片

pImage = cvCloneImage(img); //複製一份img

pImgRotation = cvCloneImage(img); //複製一份img

float m[6]; //創立矩陣m

CvMat M = cvMat(2,3,CV_32F,m);

int w = img->width; //w指向長

int h = img->height; //h指向寬

if(opt==1) factor = (cos(angle * CV_PI/180.) + 1.0)*2; //旋轉+縮放

else factor = 1; //僅旋轉

//旋轉 x= rcos(θ+α)= rcosαcosθ- rsinθsinα

m[0] = (float)(factor * cos(-angle * CV_PI/180.));

m[1] = (float)(factor * sin(-angle * CV_PI/180.));

m[3] = -m[1];

m[4] = m[0];

m[2] = w*0.5f;

m[5] = h*0.5f;

//dst(x,y) = A * src(x,y) + b

cvZero(pImgRotation);

cvGetQuadrangleSubPix(pImage,pImgRotation,&M);

cvNamedWindow("Rotation Image",1); //創立視窗名稱為Rotation Image

cvShowImage("Rotation Image",pImgRotation); //顯示pImgRotation圖片

cvWaitKey(0); //等待key按下之時間(<=0為無線等待)

cvReleaseImage(&pImage); //pImage之圖片釋放

cvReleaseImage(&pImgRotation); //pImgRotation e之圖片釋放

cvDestroyWindow("Rotation Image"); //銷毀Rotation Image窗口

}

/*

(所使用之openCV函數):

1. cvCloneImage:複製一份image

2. cvCreatImage:創造一份image

3. cvCvtcolor:把輸入之圖片轉成灰階後輸出

4. cvvNamedWindow:創立視窗的名稱

5. cvvShowImage:秀出image

6. cvDestoryWindow:銷毀視窗

7. cvReleaseimage:釋放圖片

8. cvGetQuadrangleSubPix:從圖像中src提取四邊形,使用子精像度精度,將結果存於dst

*/

3 則留言:

  1. 有文字檔和程式碼
    webhd: CV_Ch6

    回覆刪除
  2. 關於旋轉的這段
    if(opt) factor = (cos(angle * CV_PI/180.) + 1.0)*2; //旋轉+縮放

    else factor = 1;
    m[0] = (float)(factor * cos(-angle * CV_PI/180.));

    m[1] = (float)(factor * sin(-angle * CV_PI/180.));

    m[3] = -m[1];

    m[4] = m[0];

    m[2] = w*0.5f;

    m[5] = h*0.5f;

    cvZero(pImgRotation);

    cvGetQuadrangleSubPix(pImage,pImgRotation,&M);

    這段不是很懂

    回覆刪除
  3. CFileDialog 這個我還是不明白!

    回覆刪除