学习opencv

学习OpenCV可以按照以下步骤进行:

  1. 学习C++:OpenCV主要使用C++进行开发,因此学习C++是基础。了解C++的基础语法、数据类型、指针、内存管理等基本知识,为后续学习OpenCV打下基础。
  2. 学习OpenCV基础:了解OpenCV的基本概念和函数,包括图像处理、视频处理、特征提取等。可以通过OpenCV官方文档或者教程进行学习。
  3. 深入学习图像处理:在OpenCV中,图像处理是一个重要的领域。学习图像的基础知识,如像素、色彩空间、滤波等,并掌握OpenCV提供的各种图像处理函数。
  4. 深入学习计算机视觉:计算机视觉是OpenCV的核心领域之一。学习计算机视觉的基础知识,如特征检测、物体检测、图像分割等,并掌握OpenCV提供的各种计算机视觉算法。
  5. 掌握OpenCV的高级功能:OpenCV不仅提供了基本的图像处理和计算机视觉功能,还提供了许多高级的功能,如机器学习、光学字符识别等。可以根据自己的兴趣和需求进行学习和掌握。
  6. 实践项目:通过实践项目来巩固所学知识,并提高自己的实际开发能力。可以找一些OpenCV相关的项目进行实践,如人脸识别、车牌识别、机器人视觉等。

总之,学习OpenCV需要一定的数学和编程基础,需要持续的实践和探索,同时也可以通过参加相关课程和参考相关教程来系统学习。

 

开胃小菜:

OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库,它包含了大量的图像和视频处理函数。其中,Mat类是OpenCV中用于存储图像和矩阵的容器类。

下面是从安装OpenCV到利用Mat创建存储图像和矩阵的实例的详细步骤:

 

1. 安装OpenCV

安装OpenCV需要先安装一些依赖项,如CMake、GCC、G++、Boost等。下面是具体的步骤:

(1)下载OpenCV源代码并解压缩到本地。
(2)安装CMake并配置环境变量。
(3)安装GCC、G++、Boost等依赖项。
(4)使用CMake创建项目并配置OpenCV。
(5)使用编译器编译项目,并找到安装目录进行安装。

 

  1. 下载OpenCV源代码并解压缩到本地

在官方网站下载OpenCV的源代码,然后将其解压缩到本地目录中。

  1. 安装CMake并配置环境变量

在官方网站下载CMake安装包,然后按照提示进行安装。安装完成后,将CMake的安装路径添加到系统环境变量中。

  1. 安装GCC、G++、Boost等依赖项

在终端中输入以下命令,使用包管理器安装GCC、G++和Boost等依赖项:

sudo apt-get install build-essential cmake libboost-all-dev

  1. 使用CMake创建项目并配置OpenCV

进入到OpenCV的源代码目录,然后执行以下命令:

mkdir build && cd build
cmake ..

这个命令会在build目录下创建一个CMake项目,并配置OpenCV。如果一切顺利,将看到“-- Found OpenCV components: core, highgui, imgproc”等提示信息。

  1. 使用编译器编译项目,并找到安装目录进行安装

进入到刚刚创建的CMake项目目录下,执行以下命令进行编译:

make

如果编译成功,将看到终端中有“Buildfile: out”等提示信息。接着执行以下命令将OpenCV安装到本地目录中:

sudo make install

安装完成后,就可以在系统环境变量中设置OpenCV的安装目录,以便在程序中使用OpenCV库。

 

 

 

2. 创建并配置OpenCV项目

使用CMake创建一个新的项目,并将OpenCV源代码添加到该项目中。在配置时需要指定使用的编译器和编译器版本。

 

3. 编译OpenCV

使用编译器编译OpenCV项目。如果出现任何问题,可以查看CMake生成的文档以了解如何解决它们。

 

4. 利用Mat创建存储图像和矩阵的实例

下面是一个简单的示例程序,演示如何使用Mat创建和存储图像和矩阵数据:

(1)创建一个名为“image_process.cpp”的文件,并将以下代码复制到该文件中:

#include <opencv2/opencv.hpp>  
using namespace cv;  
  
int main() {  
    // 从文件中读取图像数据并存储到Mat对象中  
    Mat image = imread("image.jpg");  
  
    // 创建空的Mat对象并向其中存储数据  
    Mat matrix(3, 3, CV_32F); // 创建一个3x3的矩阵,数据类型为32位浮点数型  
    for (int i = 0; i < 3; i++) { // 向其中填充数据  
        for (int j = 0; j < 3; j++) {  
            matrix.at<float>(i, j) = (i + j); // 向其中填充数据  
        }  
    }  
  
    // 将Mat对象中的图像数据显示出来  
    imshow("Image", image); // 显示图像窗口  
    waitKey(0); // 等待用户按下按键后显示下一个窗口  
  
    // 将Mat对象中的矩阵数据显示出来  
    imshow("Matrix", matrix); // 显示矩阵窗口  
    waitKey(0); // 等待用户按下按键后显示下一个窗口  
  
    return 0;  
}

  

(2)在终端中进入项目根目录,并执行以下命令进行编译:

g++ image_process.cpp -o image_process pkg-config --cflags --libs opencv4

行代码是一个使用g++编译器的C++编译命令。每个参数的含义如下:

g++: 这是GNU编译器套件中的C++编译器。它用于将C++源代码编译为可执行二进制文件。
image_process.cpp: 这是要编译的C++源代码文件名。
-o image_process: -o表示输出文件名。在这个例子中,编译后的可执行文件将被命名为image_process。
pkg-config --cflags --libs opencv4: 这个命令用于获取OpenCV库的相关信息,包括头文件路径和链接库路径。
    pkg-config是一个帮助你在编译时确定库的编译和链接标志的工具,
    --cflags获取头文件路径,
    --libs获取链接库路径。
    opencv4是你想使用的库的名称。

  

(3)执行以下命令运行程序:./image_process运行程序后,会先弹出一个显示图像的窗口,然后弹出一个显示矩阵的窗口。

 

 

 

 

==============

以下是一些使用OpenCV进行图像读取与保存、图像转换、图像增强、直方图均衡化、白平衡和去噪的实例:

  1. 图像读取与保存:

#include <opencv2/opencv.hpp>  
  
int main() {  
    // 读取图像  
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);  
  
    // 如果读取成功,显示图像  
    if (img.empty()) {  
        std::cout << "无法读取图像" << std::endl;  
        return -1;  
    }  
  
    // 显示图像  
    cv::imshow("Image", img);  
  
    // 等待按键  
    cv::waitKey(0);  
  
    // 保存图像  
    cv::imwrite("new_image.jpg", img);  
  
    return 0;  
}

  

  1. 图像转换:

#include <opencv2/opencv.hpp>  
  
int main() {  
    // 读取图像  
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);  
  
    // 转换颜色空间,例如从BGR转为灰度图像  
    cv::Mat gray_img;  
    cv::cvtColor(img, gray_img, cv::COLOR_BGR2GRAY);  
  
    // 显示灰度图像  
    cv::imshow("Gray image", gray_img);  
  
    // 等待按键  
    cv::waitKey(0);  
  
    return 0;  
}

  

  1. 图像增强:

#include <opencv2/opencv.hpp>  
  
int main() {  
    // 读取图像  
    cv::Mat img = cv::imread("image.jpg", cv::IMREAD_COLOR);  
  
    // 应用直方图均衡化  
    cv::Mat eq_img;  
    cv::equalizeHist(img, eq_img);  
  
    // 显示均衡化后的图像  
    cv::imshow("Equalized image", eq_img);  
  
    // 等待按键  
    cv::waitKey(0);  
  
    return 0;  
}

  

  1. 白平衡:

以下是基于C++的OpenCV白平衡的实例:

#include <opencv2/opencv.hpp>  
#include <iostream>  
  
using namespace cv;  
using namespace std;  
  
int main() {  
    // 读取图像  
    Mat img = imread("image.jpg", IMREAD_COLOR);  
  
    // 检查图像是否为空  
    if (img.empty()) {  
        cout << "无法读取图像" << endl;  
        return -1;  
    }  
  
    // 显示原始图像  
    cout << "原始图像:" << endl;  
    imshow("Original Image", img);  
  
    // 白平衡  
    Mat bw_img;  
    cvtColor(img, bw_img, COLOR_BGR2GRAY);  // 转为灰度图像  
    Mat wb_img;  
    equalizeHist(bw_img, wb_img);  // 应用直方图均衡化  
  
    // 显示白平衡后的图像  
    cout << "白平衡后的图像:" << endl;  
    imshow("White Balanced Image", wb_img);  // 白平衡后的图像以灰度形式显示出来,可再次转为彩色显示。这里需要先转为灰度再显示。如果不转为灰度直接显示可能色彩会有些许偏差。转灰度代码如下:Mat bw_img; cvtColor(wb_img, bw_img, COLOR_BGR2GRAY); imshow("White Balanced Image", bw_img); ])?")") {  //再次转为彩色显示: Mat color_wb_img; cvtColor(wb_img, color_wb_img, COLOR_GRAY2BGR); imshow("White Balanced Image", color_wb_img);  // wb_img转为彩色形式显示出来。这里需要先转为彩色再显示。如果不转为彩色直接显示可能色彩会有些许偏差。转彩色代码如下:Mat color_wb_img; cvtColor(wb_img, color_wb_img, COLOR_GRAY2BGR); imshow("White Balanced Image", color_wb_img); ])?")") {  // wb_img转为彩色形式显示出来。这里需要先转为彩色再显示。如果不转为彩色直接显示可能色彩会有些许偏差。转彩色代码如下:Mat color_wb_img; cvtColor(wb_img, color_wb_img, COLOR_GRAY2BGR); imshow("White Balanced Image", color_wb_img); ))))))))333333333333333333333333333333333333333333333311111111111111111111111111111111111----)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

  

5.以下是基于C++的OpenCV去噪的实例:

#include <opencv2/opencv.hpp>  
#include <iostream>  
  
using namespace cv;  
using namespace std;  
  
int main() {  
    // 读取图像  
    Mat img = imread("image.jpg", IMREAD_COLOR);  
  
    // 检查图像是否为空  
    if (img.empty()) {  
        cout << "无法读取图像" << endl;  
        return -1;  
    }  
  
    // 显示原始图像  
    cout << "原始图像:" << endl;  
    imshow("Original Image", img);  
  
    // 去噪  
    Mat denoised_img;  
    GaussianBlur(img, denoised_img, Size(5, 5), 0, 0);  // 使用高斯滤波进行去噪  
  
    // 显示去噪后的图像  
    cout << "去噪后的图像:" << endl;  
    imshow("Denoised Image", denoised_img);  
  
    // 等待按键  
    waitKey(0);  
  
    return 0;  
}

  

这段代码使用OpenCV中的GaussianBlur函数来进行去噪处理。它使用一个5x5的高斯滤波器,没有额外的均值或标准差参数。这个函数对图像进行平滑处理,可以消除一些噪声。注意,如果你希望使用不同的去噪方法或者更复杂的去噪效果,你可能需要使用其他更专业的去噪算法。

 

这段代码是使用OpenCV库进行图像去噪处理的简单示例。要执行此代码,您需要进行以下步骤:

  1. 确保您已经安装了OpenCV库。您可以从OpenCV官方网站下载并安装它。在安装过程中,请确保将OpenCV库的路径添加到系统的环境变量中。

  2. 将代码保存为名为denoise.cpp的文件。

  3. 编译代码。您可以使用C++编译器(如g++)来编译代码。在命令行或终端中,导航到包含代码文件的目录,并运行以下命令:

g++ -o denoise denoise.cpp `pkg-config --cflags --libs opencv4`

 

这将使用pkg-config工具来自动获取OpenCV的头文件和库文件路径,并将它们与您的代码一起编译。
4. 运行可执行文件:编译成功后,您将在当前目录下获得一个名为denoise的可执行文件。在命令行或终端中,运行以下命令:

./denoise

  

这将执行代码并显示原始图像和去噪后的图像。

请注意,代码中使用的图像文件名为image.jpg。在执行代码之前,确保将此文件放置在与代码文件相同的目录中,或者将图像文件名更改为正确的路径和文件名。

希望这可以帮助您执行这段代码!如有其他问题,请随时提问。

 
 
 

以下是基于C++的OpenCV库进行视频读取、编码,解码和播放以及视频分析的示例代码。

  1. 视频读取与编码:这个示例将读取一个视频文件,并将每一帧编码为JPEG图像。

#include <opencv2/opencv.hpp>  
#include <iostream>  
  
int main() {  
    // 打开视频文件  
    cv::VideoCapture cap("video.mp4");  
  
    if (!cap.isOpened()) {  
        std::cout << "无法打开视频文件" << std::endl;  
        return -1;  
    }  
  
    cv::Mat frame;  
    int frame_num = 0;  
  
    // 读取并编码视频帧  
    while (true) {  
        if (!cap.read(frame)) {  
            break;  
        }  
  
        // 将帧编码为JPEG图像  
        std::string filename = "frame" + std::to_string(frame_num) + ".jpg";  
        cv::imwrite(filename, frame);  
  
        frame_num++;  
    }  
  
    return 0;  
}

  

 
  1. 视频解码与播放:这个示例将解码从上面示例中获取的JPEG图像,并将其播放出来。

#include <opencv2/opencv.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <iostream>  
  
int main() {  
    // 解码并播放视频帧  
    for (int i = 0; i < 100; i++) {  
        std::string filename = "frame" + std::to_string(i) + ".jpg";  
        cv::Mat img = cv::imread(filename);  
  
        if (img.empty()) {  
            std::cout << "无法读取图像" << std::endl;  
            return -1;  
        }  
  
        // 显示图像  
        cv::imshow("Image", img);  
        cv::waitKey(1);  // 等待1毫秒以查看图像,如果按下任意键,将立即继续执行  
    }  
  
    return 0;  
}

  

  1. 视频分析:这个示例将对视频进行简单的分析,例如计算平均颜色。这需要在每个帧上运行一个自定义的函数。由于OpenCV不提供计算平均颜色的内置函数,所以我们需要自己实现这个函数。这个示例只展示一个非常简单的视频分析,实际中可能需要执行更复杂的计算或检测。

#include <opencv2/opencv.hpp>  
#include <iostream>  
  
// 计算图像的平均颜色  
cv::Scalar computeAverageColor(const cv::Mat& img) {  
    cv::Scalar sum = cv::Scalar(0, 0, 0);  
    for (int y = 0; y < img.rows; y++) {  
        for (int x = 0; x < img.cols; x++) {  
            sum += img.at<cv::Vec3b>(y, x);  
        }  
    }  
    return sum / (img.rows * img.cols);  
}  
  
int main() {  
    // 解码并分析视频帧  
    for (int i = 0; i < 100; i++) {  
        std::string filename = "frame" + std::to_string(i) + ".jpg";  
        cv::Mat img = cv::imread(filename);  
  
        if (img.empty()) {  
            std::cout << "无法读取图像" << std::endl;  
            return -1;  
        }  
  
        // 计算平均颜色并显示结果  
        cv::Scalar averageColor = computeAverageColor(img);  
        std::cout << "Average color: " << averageColor << std::endl;  
    }  
  
    return 0;  
}

  

以上代码示例是基础的视频处理和分析,实际应用中可能需要更复杂的算法和更多的处理步骤。在使用这些代码时,请确保您已经正确安装了OpenCV库,并根据需要修改文件路径和文件名。

 

 

 

图像中的关键点和描述符是计算机视觉领域中两个相关的重要概念。

关键点是在图像中起独特作用或具有重要意义的点,可能是角点、边缘、纹理交叉点等。这些关键点可能有助于识别或匹配不同图像中的对应特征。

描述符是一组数学结构和/或浮点值向量,用于描述关键点的特征和/或位置。描述符可能包括颜色、纹理、形状等特征的描述。这些描述符可以在特征匹配阶段使用,以确定两个关键点是否相同或相似。

通常,关键点和描述符在一起使用,以在一组图像中找到并匹配关键点。例如,在跟踪目标或识别物体时,可以使用已知描述符与新图像中的关键点进行匹配,从而识别或跟踪目标。

如需获取更多信息,可以查阅相关的专业文献或书籍,或者咨询专业人士。

下面是一个使用OpenCV的ORB(Oriented FAST and Rotated BRIEF)算法的例子,该算法用于特征检测和描述。在这个例子中,我们将读取两个图像,使用ORB算法检测关键点,并计算描述符,然后对这些描述符进行匹配。

#include <opencv2/opencv.hpp>  
#include <opencv2/features2d.hpp>  
#include <iostream>  
#include <vector>  
  
int main() {  
    // 读取两个图像  
    cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);  
    cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);  
  
    if (img1.empty() || img2.empty()) {  
        std::cout << "无法读取图像" << std::endl;  
        return -1;  
    }  
  
    // 创建ORB检测器  
    cv::Ptr<cv::Feature2D> orb = cv::ORB::create();  
  
    // 检测关键点并计算描述符  
    std::vector<cv::KeyPoint> keypoints1, keypoints2;  
    cv::Mat descriptors1, descriptors2;  
    orb->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);  
    orb->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);  
  
    // 使用BFMatcher进行描述符匹配  
    cv::BFMatcher matcher(cv::NORM_HAMMING, true);  
    std::vector<cv::DMatch> matches;  
    matcher.match(descriptors1, descriptors2, matches);  
  
    // 使用RANSAC剔除误匹配  
    double max_dist = 0;  
    double min_dist = 100;  
    for (int i = 0; i < descriptors1.rows; i++) {  
        double dist = matches[i].distance;  
        if (dist < min_dist) min_dist = dist;  
        if (dist > max_dist) max_dist = dist;  
    }  
    std::vector<cv::DMatch> good_matches;  
    for (int i = 0; i < descriptors1.rows; i++) {  
        if (matches[i].distance <= std::max(2 * min_dist, 30.0)) {  
            good_matches.push_back(matches[i]);  
        }  
    }  
  
    // 绘制匹配结果  
    cv::Mat img_matches;  
    cv::drawMatches(img1, keypoints1, img2, keypoints2, good_matches, img_matches);  
  
    // 显示匹配结果  
    cv::namedWindow("Matches", cv::WINDOW_AUTOSIZE);  
    cv::imshow("Matches", img_matches);  
  
    cv::waitKey();  
  
    return 0;  
}

  

这段代码的功能是读取两个图像,使用ORB算法找出每个图像中的关键点,计算出描述符,然后将这些描述符进行匹配,最后显示匹配结果。注意,这段代码需要你提供两张要进行匹配的图像,分别是"image1.jpg"和"image2.jpg"。如果你的图像名字或路径不同,需要你自行修改代码中的文件名。

 

这个代码是使用OpenCV库进行特征匹配的例子。特征匹配是在两个或更多的图像之间寻找相同或相似特征的过程。以下是该代码的详细解释:

  1. 引入头文件

#include <opencv2/opencv.hpp>    
#include <opencv2/features2d.hpp>    
#include <iostream>    
#include <vector>

  

 

这些头文件为程序提供了各种功能:

  • opencv2/opencv.hpp 提供了OpenCV库的基本功能。
  • opencv2/features2d.hpp 提供了特征提取和描述的功能。
  • iostream 是输入/输出流库,用于控制台的输入和输出。
  • vector 提供了支持向量数据结构的库。
  1. 主函数

int main() { ... }

  

程序的执行从main()函数开始。

  1. 读取图像

cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);    
cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);

  

 

使用imread()函数读取两个图像,并将其转换为灰度图像。cv::Mat是OpenCV中用于存储图像的矩阵类。

  1. 检查图像是否成功读取

if (img1.empty() || img2.empty()) {    
    std::cout << "无法读取图像" << std::endl;    
    return -1;    
}

  

如果任何一个图像未能成功读取,控制台会输出错误消息并结束程序。

  1. 创建ORB检测器

cv::Ptr<cv::Feature2D> orb = cv::ORB::create();

  

ORB(Oriented FAST and Rotated BRIEF)是一种特征检测方法,用于在图像中检测关键点和描述符。cv::ORB::create()方法创建了一个ORB对象。

  1. 检测关键点并计算描述符

orb->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);    
orb->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);

  

 

使用ORB检测器在两个图像中检测关键点和计算相应的描述符。detectAndCompute()方法同时进行关键点检测和描述符计算。cv::noArray()表示不使用附加的图像金字塔。

  1. 使用BFMatcher进行描述符匹配

cv::BFMatcher matcher(cv::NORM_HAMMING, true);    
matcher.match(descriptors1, descriptors2, matches);

  

 

BFMatcher是用于匹配描述符的类。它的构造函数需要两个参数:匹配方式(这里使用汉明距离)和是否使用暴力匹配(这里使用)。然后,使用match()方法来比较两个描述符集,得到匹配结果。

  1. 使用RANSAC剔除误匹配

这是为了从匹配结果中剔除那些可能是由于光照、角度变化等产生的误匹配。代码中首先计算了所有匹配的描述符之间的距离,然后设定一个阈值(两倍的最小距离或30),只保留那些距离小于这个阈值的匹配。

  1. 绘制匹配结果

cv::Mat img_matches;    
cv::drawMatches(img1, keypoints1, img2, keypoints2, good_matches, img_matches);

  

 

使用drawMatches()函数,将匹配的关键点和描述符绘制在新的图像上。good_matches是经过RANSAC剔除误匹配后保留的匹配结果。

  1. 显示匹配结果

cv::namedWindow("Matches", cv::WINDOW_AUTOSIZE);    
cv::imshow("Matches", img_matches);

  

 

创建并显示一个窗口来展示匹配的结果图像。cv::imshow()函数用于在窗口中显示图像。

  1. 等待用户输入

cv::waitKey();

  

 

该函数等待用户按键,否则窗口会一直显示。当用户按下任意键时,程序结束。

  1. 返回值
    最后,main()函数返回0,表示程序成功执行。如果读取图像失败,或者在任何其他地方发生错误,它将返回-1。
posted @ 2023-10-17 23:49  linuxws  阅读(48)  评论(0编辑  收藏  举报