將Opencv2的Mat型別資料顯示到MFC視窗上

2021-07-24 05:14:14 字數 4661 閱讀 2601

要使用微軟提供的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...