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);
显示如下: