利用warpPerspective进行图像缩放

1 篇文章 0 订阅
1 篇文章 0 订阅

我们知道warpPerspective能进行四边形转换,我们可以利用利用这个特点,实现一个图像缩放功能。
代码如下

void  ImgResize(const Mat srcImg, Mat &transformedImg, int dst_w, int dst_h)
{
    std::vector<Point2f> src(4);
    std::vector<Point2f> dst(4);

    src[0].x = 0;
    src[0].y = 0;

    src[1].x = srcImg.cols;
    src[1].y = 0;

    src[2].x = srcImg.cols;
    src[2].y = srcImg.rows;;

    src[3].x = 0;
    src[3].y = srcImg.rows;

    dst[0].x = 0;
    dst[0].y = 0;
    dst[1].x = dst_w;
    dst[1].y = 0;
    dst[2].x = dst_w;
    dst[2].y = dst_h;
    dst[3].x = 0;
    dst[3].y = dst_h;

    Mat transform = getPerspectiveTransform(src, dst);
    warpPerspective(srcImg, transformedImg, transform, Size(dst_w, dst_h));


}

测试代码如下:

Mat old =  imread("d:\\betty.jpg", 1/*IMREAD_GRAYSCALE*/);
    Mat resized;
    ImgResize(old, resized, old.rows*0.7, old.cols*0.7);
    namedWindow("old", 1);
    imshow("old", old);
    namedWindow("new", 1);
    imshow("new", resized);

感觉这个方式的缩放后图像效果比使用resize 的好些。
resize(old, resized, Size(old.cols, old.rows));

好的,我会尽力回答你的问题。首先,我需要声明一下,我是一个 AI 语言模型,没有实际的编程能力,但是我可以给你提供相关的知识和思路,帮助你解决问题。 对于你的问题,我可以给你提供一个基本的思路,来实现图像拼接。 1. 导入需要拼接的图像 使用 OpenCV 库中的 imread 函数导入需要拼接的三张图像,分别命名为 img1、img2 和 img3。 2. 检测图像特征点 使用 OpenCV 中的特征检测算法(如 SIFT、SURF 等)来检测每张图像的特征点,并计算每个特征点的描述子,将其存储在一个 vector 中。 3. 匹配特征点 使用 OpenCV 中的特征匹配算法(如 FLANN、BFMatcher 等)来匹配不同图像之间的特征点。 4. 估计图像变换 使用 OpenCV 中的图像变换算法(如 findHomography 函数)来估计每张图像之间的变换关系。 5. 进行图像拼接 使用 OpenCV 中的图像拼接算法(如 stitcher 函数)来进行图像拼接,并输出拼接后的图像。 6. 调整图像 根据实际需求,可以对拼接后的图像进行一些调整,如裁剪、缩放等。 以上是一个基本的图像拼接流程,具体实现代码可以参考以下示例: ```c++ #include <opencv2/opencv.hpp> #include <opencv2/stitching.hpp> #include <vector> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { // 导入需要拼接的图像 Mat img1 = imread("img1.jpg"); Mat img2 = imread("img2.jpg"); Mat img3 = imread("img3.jpg"); // 检测图像特征点 vector<Mat> imgs = {img1, img2, img3}; Ptr<Stitcher> stitcher = Stitcher::create(); Stitcher::Status status = stitcher->estimateTransform(imgs); if (status != Stitcher::OK) { cout << "Error: Cannot estimate transform" << endl; return -1; } vector<Mat> descriptors; for (auto& img: imgs) { vector<KeyPoint> keypoints; Mat descriptor; Ptr<FeatureDetector> detector = SIFT::create(); Ptr<DescriptorExtractor> extractor = SIFT::create(); detector->detect(img, keypoints); extractor->compute(img, keypoints, descriptor); descriptors.push_back(descriptor); } // 匹配特征点 vector<vector<DMatch>> matches; Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased"); matcher->knnMatch(descriptors[0], descriptors[1], matches, 2); vector<DMatch> good_matches; float threshold = 0.7f; for (int i = 0; i < matches.size(); i++) { if (matches[i][0].distance < threshold * matches[i][1].distance) { good_matches.push_back(matches[i][0]); } } // 估计图像变换 vector<Point2f> src_points; vector<Point2f> dst_points; for (auto& match: good_matches) { src_points.push_back(keypoints1[match.queryIdx].pt); dst_points.push_back(keypoints2[match.trainIdx].pt); } Mat H = findHomography(src_points, dst_points, RANSAC); // 进行图像拼接 Mat result; warpPerspective(img1, result, H, Size(img1.cols + img2.cols, img1.rows)); Mat half(result, Rect(0, 0, img2.cols, img2.rows)); img2.copyTo(half); // 调整图像 Rect roi = Rect(img2.cols - img3.cols / 2, 0, img3.cols / 2, img3.rows); Mat roi_img(result, roi); img3(Rect(img3.cols / 2, 0, img3.cols / 2, img3.rows)).copyTo(roi_img); // 输出结果 imwrite("result.jpg", result); return 0; } ``` 以上示例代码仅供参考,实际实现过程中还需要根据具体情况进行调整,希望能对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值