OpenCV3学习笔记(一)

本文介绍了OpenCV3的基本概念、主要模块和使用资源,包括Core、Imgproc、Highgui等模块的功能。同时,提供了加载显示图片、播放视频及视频处理的实例代码,帮助读者快速入门OpenCV3。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenCV3学习笔记(一)

初识OpenCV

OpenCV是一个开源的,优秀的计算机视觉库,官方网站为OpenCV: http://opencv.org/.
Opencv使用Git作为版本管理工具,使用CMake构建工程。OpenCV的不同版本的源码在Github上:http://github.com/opencv/opencv.

OpenCV主要的构成部分两块,OpenCV x.x.x和opencv_contrib,前者是OpenCV主体库,包含了主要的OpenCV中的函数,功能比较稳定,而contrib里面则是一些比较新的算法实现,由于稳定性没法保证,所以被先放在contrib里面,等成熟后再移到OpenCV主体库中,这也是OpenCV不同版本间的一个重要差别,在使用时需要注意看哪些功能在哪个模块里。

帮助文档

参考http://docs.opencv.org/
包含了函数,它们的参数以及使用说明。
教程http://docs.opencv.org/trunk/d9/df8/tutorial_root.html
包含了许多教程,这些教程主要是任务驱动型的,即教你如何使用OpenCV完成某一件具体的事,还有一些基础课程的教程。
快速指南http://opencv.org/quickstart.html
包含了如何指导你在特定平台上获取和运行OpenCV的相关内容。
速查表http://docs.opencv.org/3.0-last-rst/opencv_cheatsheet.pdf
只有一页的PDF,对OpenCV的一个高度压缩参考。
问答社区http://answers.opencv.org/questions/

OpenCV组成

下面是OpenCV的一些主要模块:
OpenCV部分:
Core:包含OpenCV库的基础结构以及基本操作。
Improc:图像处理模块,包含基本的图像转换,包括滤波以及类似卷积的卷积操作。
Highgui(在OpenCV3.0分割为imcodecs,videoio,highgui三部分):包含了用来显示图像或者简单的输入的用户交互函数,类似于一个轻量级的Window UI工具包。
Video:包含读取和写视频流的函数。
Calib3d:包括校准单个,双目以及多个相机的算法实现。
Feature2d:包含用于检测,描述以及匹配特征点的算法。
Objdectect:包含检测特定目标,比如人脸或者行人的算法,也可以训练检测器并用来检测其他物体。
Ml:机器学习模块,包含大量机器学习算法实现并且这些算法能够和OpenCV数据类型很好的兼任。
Flann:快速最临近库,包含了一些实现最邻近搜索算法的函数,在其他模块中会经常调用。
GPU:主要是函数在CUDA GPU上的优化实现。
Photo:包含计算摄影学的一些函数工具。
Stitching:是一个包含了精巧的图像拼接流程实现算法的模块。
Contrib:包含一些新的,还没有被集成进OpenCV库的东西。
下面是opencv_contrib里面的一些模块:
Dnn:深度神经网络
Face:人脸识别
Text:文本检测以及识别,基于许多开源的OCR算法
Rbgd:处理由Kinect或者其他深度传感器获取的RGB深度图像
Bioinspired:一些基于生物学启发的视觉算法
Tracking:现代目标追踪算法
OpenCV是一个高度模块化的视觉库,每次在使用这个库里面的相关算法时,都需要在头文件导入相关的模块,导入时就是按照上面列举的一些模块分类来进行分类导入的,知道了这些,在看一些使用OPenCV的程序时对其中的一些头文件就不会感到困惑了,从它们的头文件就能大致知道这个程序在干嘛。

入门的几个例子

加载并显示图片

#include <opencv2/opencv.hpp>    // inlucde file for every supported OpenCV function,this file include everything of OpenCV,so it very big and its compile will cost long time
#include "opencv2/highgui/highgui.hpp"    //here we only include the file that we need so that we can save some time
#include <string>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** argv){
        Mat img = cv::imread("/home/zhangjc/Programs/learning_opencv3/BlueCup.jpg");
        if(img.empty())
                return -1;
        namedWindow("Example1", WINDOW_AUTOSIZE);
        imshow("Example1", img);
        waitKey(0);
        destroyWindow("Example1");
        return 0;
}

加载并播放视频+滚动条控制

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <fstream>
 
 using namespace std;

 int g_slider_position = 0;
 int g_run = 1, g_dontset = 0;
 cv::VideoCapture g_cap;


// 滑动条的回调函数
void onTrackbarSlide(int pos, void *){
        // 点击滑动条到某位置后将视频也滑动到相应的位置
        g_cap.set(cv::CAP_PROP_POS_FRAMES,pos);
        
        if(!g_dontset)
                g_run = 1;
        g_dontset = 0;
}

int main(int argc, char ** argv){
        cv::namedWindow("Example2_4", cv::WINDOW_AUTOSIZE);
        // 打开视频
        g_cap.open("/home/zhangjc/Programs/learning_opencv3/test.avi");
        // 获得视频的相关信息
        int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);
        int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
        int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);

        cout << "Video has" << frames << " frames of dimensions(" << tmpw << "," << tmph << ")" << endl;

        // 创建滑动条
        cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames, onTrackbarSlide);

        cv::Mat frame;
        // 读取视频
        for (;;){
                if(g_run !=0){
                        g_cap >> frame;
                        if(frame.empty())
                                break;
                        // 获得当前视频帧的位置
                        int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
                        g_dontset = 1;

                        cv::setTrackbarPos("Position", "Example2_4", current_pos);
                        cv::imshow("Example2_4", frame);

                        g_run -= 1;

                }

                char c = (char)cv::waitKey(10);
                if(c=='s'){
                        g_run = 1;
                        cout << "Single step, run = " << g_run << endl;
                }
                if(c =='r'){
                        g_run = -1;
                        cout << "Run mode,run = " << g_run << endl;
                }
                if(c ==27)
                        break;
        }
        return 0;
}

视频写入

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

int main(int argc,char ** argv){

        // 创建两个窗口,分别用来显示原视频和转换后的视频
        cv::namedWindow("Example2_11", cv::WINDOW_AUTOSIZE);
        cv::namedWindow("Log_Polar", cv::WINDOW_AUTOSIZE);

        // 初始化视频对象
        cv::VideoCapture capture("/home/zhangjc/Programs/learning_opencv3/test.avi");

        double fps = capture.get(cv::CAP_PROP_FPS);
        // 定义size对象
        cv::Size size(
            (int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
            (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT)
            );

        // 定义新创建的视频对象(编码方式,帧率,大小)
        cv::VideoWriter writer;
        writer.open("/home/zhangjc/Programs/learning_opencv3/createdVideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);

        cv::Mat logpolar_frame, bgr_frame;

        for (;;){
                capture >> bgr_frame;
                if(bgr_frame.empty())
                        break;

                cv::imshow("Example2_11", bgr_frame);

                // 极坐标转换
                cv::logPolar(
                    bgr_frame,                                                                                  // 输入帧
                    logpolar_frame,                                                                        // 输出帧
                    cv::Point2f(                                                                                  //中心点
                        bgr_frame.cols / 2,                                                               // x
                        bgr_frame.rows / 2 ),                                                           // y
                    40,
                    cv::WARP_FILL_OUTLIERS);

                // 展示转换后的视频
                cv::imshow("Log_Polar", logpolar_frame);
                writer << logpolar_frame;

                char c = cv::waitKey(10);
                if( c==27 )
                        break;
        }
        capture.release();
        writer.release();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值