📜  从 OpenCV 2 过渡到 OpenCV 3.x(1)

📅  最后修改于: 2023-12-03 15:06:32             🧑  作者: Mango

从 OpenCV 2 过渡到 OpenCV 3.x

OpenCV 是计算机视觉领域最为流行的开源框架之一。本文将介绍如何从 OpenCV 2 迁移到 OpenCV 3.x 版本,从而最大化地利用新的功能和修复了的错误。

新的模块和功能

OpenCV 3.x 版本引入了很多新的模块和功能。以下是一些可能最有用的模块:

  • dnn:深度学习模块。
  • face:人脸检测和识别模块。
  • xfeatures2d:额外的特征提取模块。
  • tracking:跟踪器模块。

以下是一些可能最有用的新功能:

  • OpenCL 支持:通过添加 OpenCL 代码,加速许多算法。
  • CUDA 支持:通过添加 CUDA 代码,加速许多算法。
  • 改进的人脸检测:通过引入新的深度学习算法,可提高人脸检测的精度。
  • 增强的 CVUI:使开发更容易的用户界面库。

在迁移到 OpenCV 3.x 后,您将能够利用这些新的模块和功能。

OpenCV 2 与 OpenCV 3.x 中的差异

除了新的模块和功能外,OpenCV 3.x 相对于 OpenCV 2 做出了一些细微变化:

名称空间

OpenCV 3.x 将名称空间从 cv 更改为了 cv::。 这意味着在访问 OpenCV 中的函数和类时需要添加 cv:: 前缀。

代码示例

使用 OpenCV 2

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
    Mat img = imread("image.jpg", CV_LOAD_IMAGE_COLOR);
    imshow("Image", img);
    waitKey(0);
    return 0;
}

使用 OpenCV 3.x

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

int main()
{
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
    cv::imshow("Image", img);
    cv::waitKey(0);
    return 0;
}
cv::CV_XYZ 常量已更改为 cv::XYZ

OpenCV 3.x 不再支持 CV_(例如 CV_LOAD_IMAGE_COLOR 等)前缀来指定图像的 color space。现在,您需要明确指定 color space(例如 IMREAD_COLOR)。此更改会影响标头中的一些常量。此更改是为了简化名称空间并提高可读性。

代码示例

使用 OpenCV 2

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
    Mat img = imread("image.jpg", CV_LOAD_IMAGE_COLOR);
    cvtColor(img, img, CV_BGR2GRAY);
    imshow("Image", img);
    waitKey(0);
    return 0;
}

使用 OpenCV 3.x

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

int main()
{
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
    cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
    cv::imshow("Image", img);
    cv::waitKey(0);
    return 0;
}
大多数名称更改为小写和下划线

OpenCV 3.x 中的名称现在由小写字母和下划线组成,更加清晰明了。

代码示例

使用 OpenCV 2

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
    Mat img = imread("image.jpg", CV_LOAD_IMAGE_COLOR);
    GaussianBlur(img, img, Size(3, 3), 0, 0);
    imshow("Image", img);
    waitKey(0);
    return 0;
}

使用 OpenCV 3.x

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

int main()
{
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);
    cv::GaussianBlur(img, img, cv::Size(3, 3), 0, 0);
    cv::imshow("Image", img);
    cv::waitKey(0);
    return 0;
}
总结

OpenCV 3.x 包含许多新的模块和功能,可以提高计算机视觉应用程序的性能和精度。此外,虽然 OpenCV 3.x 的某些更改可能需要更新代码,但这些更改旨在简化代码,提高可读性。如果您已经成功实施了 OpenCV 2 应用程序,那么迁移到 OpenCV 3.x 是完全值得的一步。