題目說明:透視變換
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 提供了 多...