C++ opencv图像处理怎么实现图片几何变换

发布时间:2022-05-13 09:15:40 作者:iii
来源:亿速云 阅读:197

C++ OpenCV图像处理怎么实现图片几何变换

在计算机视觉和图像处理领域,几何变换是一种常见的操作,用于对图像进行旋转、缩放、平移、仿射变换等操作。OpenCV 是一个强大的开源计算机视觉库,提供了丰富的函数来实现这些几何变换。本文将介绍如何使用 C++ 和 OpenCV 来实现图像的几何变换。

1. 安装 OpenCV

在开始之前,确保你已经安装了 OpenCV 库。你可以通过以下命令在 Ubuntu 系统上安装 OpenCV:

sudo apt-get install libopencv-dev

如果你使用的是其他操作系统,可以参考 OpenCV 的官方文档进行安装。

2. 基本几何变换

2.1 图像缩放

图像缩放是最常见的几何变换之一。OpenCV 提供了 resize 函数来实现图像的缩放。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg");
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    cv::Mat resizedImage;
    cv::resize(image, resizedImage, cv::Size(640, 480), 0, 0, cv::INTER_LINEAR);

    cv::imshow("Resized Image", resizedImage);
    cv::waitKey(0);

    return 0;
}

在这个例子中,resize 函数将图像缩放到 640x480 的大小。cv::INTER_LINEAR 是插值方法,表示使用线性插值。

2.2 图像旋转

图像旋转可以通过 getRotationMatrix2DwarpAffine 函数来实现。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg");
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    cv::Point2f center(image.cols / 2.0, image.rows / 2.0);
    double angle = 45.0;  // 旋转角度
    double scale = 1.0;   // 缩放比例

    cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, scale);
    cv::Mat rotatedImage;
    cv::warpAffine(image, rotatedImage, rotationMatrix, image.size());

    cv::imshow("Rotated Image", rotatedImage);
    cv::waitKey(0);

    return 0;
}

在这个例子中,图像将围绕其中心旋转 45 度。

2.3 图像平移

图像平移可以通过 warpAffine 函数来实现。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg");
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    cv::Mat translationMatrix = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 50);
    cv::Mat translatedImage;
    cv::warpAffine(image, translatedImage, translationMatrix, image.size());

    cv::imshow("Translated Image", translatedImage);
    cv::waitKey(0);

    return 0;
}

在这个例子中,图像将向右平移 100 像素,向下平移 50 像素。

3. 仿射变换

仿射变换是一种更通用的几何变换,可以同时实现旋转、缩放、平移和剪切等操作。OpenCV 提供了 getAffineTransformwarpAffine 函数来实现仿射变换。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg");
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    cv::Point2f srcTri[3];
    srcTri[0] = cv::Point2f(0, 0);
    srcTri[1] = cv::Point2f(image.cols - 1, 0);
    srcTri[2] = cv::Point2f(0, image.rows - 1);

    cv::Point2f dstTri[3];
    dstTri[0] = cv::Point2f(0, image.rows * 0.33);
    dstTri[1] = cv::Point2f(image.cols * 0.85, image.rows * 0.25);
    dstTri[2] = cv::Point2f(image.cols * 0.15, image.rows * 0.7);

    cv::Mat warpMat = cv::getAffineTransform(srcTri, dstTri);
    cv::Mat warpedImage;
    cv::warpAffine(image, warpedImage, warpMat, image.size());

    cv::imshow("Warped Image", warpedImage);
    cv::waitKey(0);

    return 0;
}

在这个例子中,我们定义了三个源点和三个目标点,然后使用 getAffineTransform 计算仿射变换矩阵,并使用 warpAffine 应用该变换。

4. 透视变换

透视变换是一种更复杂的几何变换,可以用于实现图像的透视效果。OpenCV 提供了 getPerspectiveTransformwarpPerspective 函数来实现透视变换。

#include <opencv2/opencv.hpp>

int main() {
    cv::Mat image = cv::imread("input.jpg");
    if (image.empty()) {
        std::cerr << "Could not open or find the image!" << std::endl;
        return -1;
    }

    cv::Point2f srcQuad[4];
    srcQuad[0] = cv::Point2f(0, 0);
    srcQuad[1] = cv::Point2f(image.cols - 1, 0);
    srcQuad[2] = cv::Point2f(image.cols - 1, image.rows - 1);
    srcQuad[3] = cv::Point2f(0, image.rows - 1);

    cv::Point2f dstQuad[4];
    dstQuad[0] = cv::Point2f(0, image.rows * 0.33);
    dstQuad[1] = cv::Point2f(image.cols * 0.85, image.rows * 0.25);
    dstQuad[2] = cv::Point2f(image.cols * 0.85, image.rows * 0.75);
    dstQuad[3] = cv::Point2f(0, image.rows * 0.66);

    cv::Mat warpMat = cv::getPerspectiveTransform(srcQuad, dstQuad);
    cv::Mat warpedImage;
    cv::warpPerspective(image, warpedImage, warpMat, image.size());

    cv::imshow("Warped Perspective Image", warpedImage);
    cv::waitKey(0);

    return 0;
}

在这个例子中,我们定义了四个源点和四个目标点,然后使用 getPerspectiveTransform 计算透视变换矩阵,并使用 warpPerspective 应用该变换。

5. 总结

本文介绍了如何使用 C++ 和 OpenCV 实现图像的几何变换,包括缩放、旋转、平移、仿射变换和透视变换。通过这些基本的几何变换,你可以对图像进行各种复杂的操作,以满足不同的应用需求。OpenCV 提供了丰富的函数和工具,使得这些操作变得简单而高效。希望本文能帮助你更好地理解和应用 OpenCV 进行图像处理。

推荐阅读:
  1. C++如何实现json形式的Socket传输图片
  2. C++如何实现单张图片读取和保存

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ opencv

上一篇:Qt怎么实现HTTP的Get/Post请求

下一篇:Python数据分析之Matplotlib 3D图怎么实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》