要使用微軟提供的cimage類需要包含標頭檔案:
#include //mfc自帶的影象類
之後便是將opencv2的mat型別的資料轉換為cimage型別的資料:
//************************************
// 函式名稱: convertmat2cimage
// 訪問許可權: public
// 建立日期: 2016/10/26
// 創 建 人:
// 函式說明: 將cv::mat型別的影象資料轉換為cimage型別的資料
// 函式引數: const cv::mat & src_img 輸入的cv::mat影象資料
// 函式引數: cimage & dst_img 轉換之後的cimage型別
// 返 回 值: bool
//************************************
bool cimage2dc::convertmat2cimage(const cv::mat& src_img, cimage& dst_img)
int width = src_img.cols; //獲取輸入影象的寬度
int height = src_img.rows; //獲取輸入影象的高度
int channels = src_img.channels(); //獲取輸入影象的
int src_type = src_img.type();
dst_img.destroy();
switch (src_type)
//畫素的排列方式是自左上開始的
else
}} break;
} case cv_8uc3:
}} break;
} default:
messagebox(null, _t("輸入的影象型別出錯"), _t("提示"), mb_iconinformation | mb_ok);
break;
} return true;
}
之後是呼叫cimage::draw()函式實現顯示:
//************************************
// 函式名稱: show2dc
// 訪問許可權: public static
// 建立日期: 2016/10/26
// 創 建 人:
// 函式說明: 將mat資料型別的影象像是在dc指向的視窗上
// 函式引數: const cv::mat & img 輸入影象資料
// 函式引數: hdc dst_hdc 輸出影象資料
// 函式引數: const unsigned int dc_heigh dc所指向視窗的高度
// 函式引數: const unsigned int dc_width dc所指向視窗的寬度
// 返 回 值: bool
//************************************
bool cimage2dc::show2dc(const cv::mat& img, hdc dst_hdc, const unsigned int dc_heigh, const unsigned int dc_width)
cimage dst_img;
cv::mat temp; //定義中間變數
image2dc->getfixmat(img, temp, dc_heigh, dc_width); //影象的幾何大小變換
image2dc->convertmat2cimage(temp, dst_img); //影象轉換
int offsetx = (dc_width - temp.cols) / 2; //調整偏移量
int offsety = (dc_heigh - temp.rows) / 2;
bool temp1 = dst_img.draw(dst_hdc, offsetx, offsety, dst_img.getwidth(), dst_img.getheight()); //影象顯示
return true;
}
在影象顯示的時候可以調整影象的顯示位置和大小,在上面的**中對應的函式是getfixmat()函式:
//************************************
// 函式名稱: getfixmat
// 訪問許可權: private
// 建立日期: 2016/10/26
// 創 建 人:
// 函式說明: 將輸入影象調整到適合在dc所指向的視窗上顯示
// 函式引數: const cv::mat & src_img 輸入影象
// 函式引數: cv::mat & dst_img 輸出影象
// 函式引數: unsigned int dc_heigh dc所指向視窗的高度
// 函式引數: unsigned int dc_width dc所指向視窗的寬度
// 返 回 值: bool
//************************************
bool cimage2dc::getfixmat(const cv::mat& src_img, cv::mat& dst_img, unsigned int dc_heigh, unsigned int dc_width)
unsigned int img_rows(src_img.rows);
unsigned int img_cols(src_img.cols);
unsigned int fix_heigh(std::min(img_rows, dc_heigh));
unsigned int fix_width(std::min(img_cols, dc_width));
float ratio_w = static_cast(fix_width) / static_cast(img_cols);
float ratio_h = static_cast(fix_heigh) / static_cast(img_rows);
float ratio = std::min(ratio_w, ratio_h);
int show_width = static_cast(ratio * img_cols);
int show_height = static_cast(ratio * img_rows);
cv::resize(src_img, dst_img, cv::size(show_width, show_height), (0.0), (0.0), cv::inter_linear);
return true;
}
//************************************
// 函式名稱: show2dc
// 訪問許可權: public static
// 建立日期: 2016/10/26
// 創 建 人:
// 函式說明: 將mat資料型別的影象像是在dc指向的視窗上
// 函式引數: const cv::mat & img 輸入影象資料
// 函式引數: hdc dst_hdc 輸出影象資料
// 函式引數: const unsigned int dc_heigh dc所指向視窗的高度
// 函式引數: const unsigned int dc_width dc所指向視窗的寬度
// 返 回 值: bool
//************************************
bool cimage2dc::show2dc(const cv::mat& img, hdc dst_hdc, const unsigned int dc_heigh, const unsigned int dc_width)
cv::mat temp; //定義中間變數
image2dc->getfixmat(img, temp, dc_heigh, dc_width); //影象的幾何大小變換
int offsetx = (dc_width - temp.cols) / 2; //調整偏移量
int offsety = (dc_heigh - temp.rows) / 2;
iplimage *p_img;
p_img = &(iplimage)img; //mat -> iplimage*
crect rect = crect(offsetx, offsety, offsetx + temp.rows, offsety + temp.cols);
cvvimage cimg;
cimg.copyof(p_img);
cimg.drawtohdc(dst_hdc, &rect); //交由cvvimage類的drawtohdc函式繪製影象到視窗上
return true;
}
在這裡需要的是cvvimage類,我會在接下來一篇部落格中貼出
Opencv2與opencv1的區別
一 opencv2與opencv1的區別 opencv1.0 版本於2006年面世,主要基於c語言。2009年發布opencv2,主要基於c 此時opencv庫被劃分成多個模組,這些模組被編譯成庫檔案後,位於lib資料夾中。主要有以下模組 版本1的結構見我的這篇blog opencv core 模組...
OpenCV2簡單的特徵匹配
特徵的匹配大致可以分為3個步驟 特徵的提取 計算特徵向量 特徵匹配 對於3個步驟,在opencv2中都進行了封裝。所有的特徵提取方法都實現featuredetector介面,descriptorextractor介面則封裝了對特徵向量 特徵描述符 的提取,而所有特徵向量的匹配都繼承了descript...
OpenCV2簡單的特徵匹配
特徵的匹配大致可以分為3個步驟 特徵的提取 計算特徵向量 特徵匹配 對於3個步驟,在opencv2中都進行了封裝。所有的特徵提取方法都實現featuredetector介面,descriptorextractor介面則封裝了對特徵向量 特徵描述符 的提取,而所有特徵向量的匹配都繼承了descript...