m_image = cv::imread("C:/Code/JPG/1.jpg");
if (m_image.empty()) return;
cv::imshow("原始图像", m_image);
// TODO: 在此添加控件通知处理程序代码
int width = m_image.cols;
int height = m_image.rows;
// 确定要放大的区域(这里是图像中心部分)
int roiWidth = width / 3;
int roiHeight = height / 3;
int roiX = (width - roiWidth) / 2;
int roiY = (height - roiHeight) / 2;
cv::Rect roi(roiX, roiY, roiWidth, roiHeight);
cv::Mat roiImg = m_image(roi);
double scale = 2.0;
int enlargedWidth = static_cast<int>(roiWidth * scale);
int enlargedHeight = static_cast<int>(roiHeight * scale);
cv::Mat enlargedRoiImg(enlargedHeight, enlargedWidth, m_image.type());
for (int y = 0; y < enlargedHeight; ++y)
{
for (int x = 0; x < enlargedWidth; ++x)
{
double origX = static_cast<double>(x) / scale;
double origY = static_cast<double>(y) / scale;
int x1 = static_cast<int>(origX);
int y1 = static_cast<int>(origY);
int x2 = (x1 == roiWidth - 1) ? x1 : x1 + 1;
int y2 = (y1 == roiHeight - 1) ? y1 : y1 + 1;
double dx = origX - x1;
double dy = origY - y1;
cv::Vec3b p1 = roiImg.at<cv::Vec3b>(y1, x1);
cv::Vec3b p2 = roiImg.at<cv::Vec3b>(y1, x2);
cv::Vec3b p3 = roiImg.at<cv::Vec3b>(y2, x1);
cv::Vec3b p4 = roiImg.at<cv::Vec3b>(y2, x2);
cv::Vec3b newPixel;
newPixel[2] = static_cast<uchar>((1 - dx) * (1 - dy) * p1[2] + dx * (1 - dy) * p2[2] + (1 - dx) * dy * p3[2] + dx * dy * p4[2]);
newPixel[1] = static_cast<uchar>((1 - dx) * (1 - dy) * p1[1] + dx * (1 - dy) * p2[1] + (1 - dx) * dy * p3[1] + dx * dy * p4[1]);
newPixel[0] = static_cast<uchar>((1 - dx) * (1 - dy) * p1[0] + dx * (1 - dy) * p2[0] + (1 - dx) * dy * p3[0] + dx * dy * p4[0]);
enlargedRoiImg.at<cv::Vec3b>(y, x) = newPixel;
}
}
CRect rect;
mStaticShowRegion.GetClientRect(&rect);
ClientToScreen(rect);
cv::Rect enlargedRoiRect(rect.left, rect.top, width, height);
cv::imshow("放大2倍", enlargedRoiImg);
cv::waitKey(0);
显示如下: