《學習OpenCV》第四章課後題7

2021-07-05 04:21:44 字數 3328 閱讀 3400

題目說明:透視變換

a.寫乙個程式讀入一幅影象,並使用數字鍵1~9控制變換矩陣(參考cvwarpperspective()函式)。按住任意1~9中的任意乙個按鍵,透視變換矩陣中對應資料會變大。同時按下shift鍵時,對應資料會減小(最小為0)。每次改變乙個資料,在兩個視窗中顯示影象:原始影象和變換後的影象。

b.新增放大、縮小功能。

c.新增旋轉影象功能。

**使用說明:由於opencv中沒有找到實現鍵盤『組合鍵』的功能,所以**使用方式有些改變

程式執行後:

step1:有三種按鍵方式z—縮放、r—旋轉、p—透視變換

step2(1):然後接著對於z—縮放、r—旋轉可以有-和+兩種方式(與主鍵盤數字鍵共行的按鍵,直接按不用按shift)進行操作。

step2(2):對於p—透視變換,先選擇h矩陣要增減的位置,即1~9(h矩陣按行優先排列),然後再按-和+兩種方式(與主鍵盤數字鍵共行的按鍵,直接按不用按shift)進行操作

注:退出z—縮放、r—旋轉、p—透視變換操作按ese鍵

#include 

#include

#define warpstepsize 0.2 // 透視變換矩陣每次的變化率

#define resizestepsize 0.1 // 放大、縮小每次的變化率

#define rotatestepsize 10 // 旋轉影象時每次旋轉的角度(逆時針)

//變化數值

float g_h_value = 0;

float g_resize_value = 0;

int g_rotatedegree = 0;

//影象縮放定義

void zoom_outorin(iplimage *dst_imresize,float g_resize_value);

//影象旋轉定義

void rotateimage_cworccw(iplimage* dst_rotate,float g_rotatedegree);

//影象透視投影

void changeg_h_plus(cvmat *h,char d,float g_h_value );

void warpperspective(iplimage *src,iplimage *dst,const cvmat warp_matrix,char d);

void warpperspective_plusorsub(iplimage *src,iplimage *dst,cvmat *h,char d,float g_h_value);

//主函式

int main()

//初始化h矩陣

float a[9]=;

const cvmat warp_matrix = cvmat(3, 3, cv_32fc1,a);

//初始化縮放、旋轉、透視投影原始矩陣

iplimage *dst_rotate,*dst_imresize,*dst_perspective;

dst_rotate = cvcloneimage(src);

dst_imresize = cvcloneimage(src);

dst_perspective = cvcloneimage(src);

printf("input z means zoom in or zoom out\n");

printf("input r means rotate\n");

printf("input p means perspective\n");

cvnamedwindow("source_image", 1);

while(1)

if (d == 27) break;

}cvdestroywindow("resize_image");

g_resize_value = 0;

cvreleaseimage(&dst_imresize);

dst_imresize = cvcloneimage(src);

break;

}//114 -- 旋轉影象

case

114:

if (d == 27) break;

}cvdestroywindow("rotate_image");

g_rotatedegree = 0;

cvreleaseimage(&dst_rotate);

dst_rotate = cvcloneimage(src);

break;

}//112 -- 透射變換

case

112:

if(d == 27) break;

}cvdestroywindow("perspective_image");

break;}}

if (c == 27) break;

}cvreleaseimage(&src);

cvreleaseimage(&dst_rotate);

cvreleaseimage(&dst_imresize);

cvreleaseimage(&dst_perspective);

cvdestroyallwindows();

return0;}

//影象縮放

void zoom_outorin(iplimage *dst_imresize,float g_resize_value)

//影象旋轉

void rotateimage_cworccw(iplimage* dst_rotate,float g_rotatedegree)

//影象透視投影

void changeg_h_plus(cvmat *h,char d,float g_h_value )

void warpperspective_plusorsub(iplimage *src,iplimage *dst,cvmat *h,char d,float g_h_value)

void warpperspective(iplimage *src,iplimage *dst,const cvmat warp_matrix,char d)

if (e == 27) break;

}cvdestroywindow("perspective_h_chagne");

g_h_value = 0;

cvreleaseimage(&dst);

dst = cvcloneimage(src);

}

注:透視變化結果可以執行**嘗試,本程式對於理解透視『變換矩陣h』很有幫助。

部分引用:qdsclove的專欄

第四章課後習題

第四章處理器體系結構,看了蠻久的。內容倒是挺多的,首先這章將彙編指令轉化為二進位制 然後又研究了下y86命令集下彙編指令的微實現。然後就開始了處理器的實現。處理器的實現,則是首先從seq的順序實現出發,然後講解了5個環節的控制邏輯的實現。之後則是流水線的實現,流水線的實現無非就是各個狀態的 但是比較...

第四章 課後習題

一 填空題 1 如類果類a繼承了b,那麼類a被稱為派生 類,而類b被稱為基 類。2 c 的兩種繼承為 單繼承 和多繼承 3 在預設情況下的繼承方式為私有繼承方式 4 從基類中公有派生乙個類時,基類的公有成員就成為派生類的公有 成員,而這個基類的保護成員就成為派生類的保護成員。5 c 提供了多繼承 機...

第四章課後習題

一 填空題 1 如類果類a繼承了b,那麼類a被稱為 基類,而類b被稱為 派生類。2 c 的兩種繼承為 單繼承和 多繼承。3 在預設情況下的繼承方式為 私有繼承方式 4 從基類中公有派生乙個類時,基類的公有成員就成為派生類的 公有 成員,而這個基類的保護成員就成為派生類的 保護成員。5 c 提供了 多...