项目【MFC】总结(三)——图像灰度化/彩色化

关于界面左边的按钮事件 “上一帧”、“下一帧”、“跳转至”以及三个“编辑框显示”的功能比较简单,这里就不在记录了。需要注意的是,变量命名一定要规范,这样自己就不容易混乱。比如,原始读入的图像为Img,当前帧为Current_Img,调整帧号为Goto_farme_num等。

这一次记录一下右边的【彩色化】和【灰度化】功能,可能更加偏向图像方面而非MFC了。

灰度化 /彩色化

很简单,灰度化就是将读入的图像直接显示,这里涉及到数组转图像(Vector->Mat)。

数组转图像代码如下:

//数组转Mat
void VecToMat(vector> Vec, Mat &img){int rows = Vec.size();int cols = Vec[0].size();short *ptmp = NULL;img = cv::Mat::zeros(Size(cols, rows), CV_16UC1);for (int i = 0; i (i);for (int j = 0; j < cols; ++j){if (Vec[i][j] < 0)ptmp[j] = 0;elseptmp[j] = Vec[i][j];}}
}

 

 灰度化就直接将上述转好的图像显示即可,彩色化需要将灰度图转为伪彩色图,主要用到OpenCV的API:applyColorMap

代码如下:

cv::Mat get_img(vector>> csvData_Slip, int res_X, int res_Y,int num,bool color){int rows = csvData_Slip[0].size();int cols = csvData_Slip[0][0].size();Mat img = cv::Mat::zeros(Size(cols, rows), CV_16UC1);for (int i = num; i <= num; ++i){VecToMat(csvData_Slip[i], img);img.convertTo(img, CV_8U, 1, 0);if (color)cv::applyColorMap(img, img, 2);//2、6  伪彩色图}return img;}

applyColorMap参数详解:https://blog.csdn.net/loveliuzz/article/details/73648505

 

整个灰度化/彩色化代码,不可直接复制(有很多全局变量未添加):

//灰度
void CTouch_test_CKV10Dlg::OnBnClickedButtongray()
{// TODO: Add your control notification handler code hereUpdateData(TRUE);zoom = false;if (Frame_Num > 0){Color = false;img = get_img(csvData_Slip, 1920, 1080, current_frame - 1, Color);CRect rect;GetDlgItem(IDC_STATIC_IMG)->GetClientRect(&rect);Rect dst(rect.left, rect.top, rect.right, rect.bottom);resize(img, current_img, cv::Size(rect.Width(), rect.Height()));//若前一帧缩放,后一帧也保持前一张的尺寸不变if (pre_zoom){double  new_zoom = double(resize_mat.rows) / current_img.rows;resize(current_img, current_img, Size(), new_zoom, new_zoom, INTER_NEAREST); //按比例放大图片}//分辨率RX = current_img.cols;RY = current_img.rows;if (g_iZoom <= 1)m_resize = g_iZoom * 4;elsem_resize = g_iZoom + 3;imshow("view", current_img);UpdateData(FALSE);}else{INT_PTR nRes;// 显示消息对话框   nRes = MessageBox(_T("请先读入数据!"), _T("数据读取"), MB_OKCANCEL | MB_ICONWARNING);}
}//彩色
void CTouch_test_CKV10Dlg::OnBnClickedButtoncolor()
{// TODO: Add your control notification handler code hereUpdateData(TRUE);zoom = false;if (Frame_Num > 0){Color = true;img = get_img(csvData_Slip, 1920, 1080, current_frame - 1, Color);CRect rect;GetDlgItem(IDC_STATIC_IMG)->GetClientRect(&rect);Rect dst(rect.left, rect.top, rect.right, rect.bottom);resize(img, current_img, cv::Size(rect.Width(), rect.Height()));//若前一帧缩放,后一帧也保持前一张的尺寸不变if (pre_zoom){double  new_zoom = double(resize_mat.rows) / current_img.rows;resize(current_img, current_img, Size(), new_zoom, new_zoom, INTER_NEAREST); //按比例放大图片}//分辨率RX = current_img.cols;RY = current_img.rows;if (g_iZoom <= 1)m_resize = g_iZoom * 4;elsem_resize = g_iZoom + 3;imshow("view", current_img);UpdateData(FALSE);}else{INT_PTR nRes;// 显示消息对话框   nRes = MessageBox(_T("请先读入数据!"), _T("数据读取"), MB_OKCANCEL | MB_ICONWARNING);}
}

END!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部