OpenCV常见API C++版:

一、引言:

本篇博客为嵌入式AI项目中学习总结

二、基本用法:

1. 基本用法:

1.1 头文件:

#include<opencv2/opencv.hpp>//包含了关于opencv的所有库, 可以只调用这个就行
#include<opencv2/imgcodecs.hpp> //图像的读取和写入
#include<opencv2/highgui.hpp>//创建图形用户界面
#include<opencv2/imgproc.hpp>//图像处理的函数

1.2 OpenCV查看图片

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;
int main()
{
    // 查看图片
    string path = "../cv.jpg";          
    Mat img = imread(path);          //在OpenCV中图片格式通常使用Mat保存   
    namedWindow("image");		    //新建图形化窗口
    imshow("imge", img);			//图片展示
    waitKey(0);             		//图片展示的时长, 传参: 延迟毫秒数ms(0表示无限等待直到按键)
    return 0;
}

1.2.1 补充:

  1. imread():

    imread();
    // 第二个参数:
    	// 1. IMREAD_UNCHANGED: 按原样加载图像,保留所有信息
    	// 2. IMREAD_GRAYSCALE: 将图像转换为灰度图
    	// 3. IMREAD_COLOR:		将图像转换为彩色 BGR 格式, (正常图是RGB, OPenCV里面是BGR)
    
  2. emptywaitKey

    int main()
    {
        string path = "../cv.jpg";
        Mat img = imread(path, IMREAD_GRAYSCALE);
        if(img.empty()){
            cout << "img error" << endl;
            return -1;
        }
        imshow("img", img);
        imwrite("img0.jpg", img);
       	waitKey(0);
        return 0;
    }
    

1.3 OpenCV查看视频

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;


int main()
{
    // 查看视频
    string path = "../test.mp4";
    VideoCapture cap(path);			//视频文件路径 或 摄像头ID(0=默认摄像头)
    Mat img;

    while(1){
        cap.read(img);				// 使用read方法将视频帧保存到img中
        imshow("cap", img);			
        waitKey(2);					//每帧图片显示时长为2ms
    }
}

1.3.1 补充:

  1. isOpened() 和 cap.get:

    int main()
    {
        string path = "../test.mp4";
        VideoCapture cap(path);
        if(!cap.isOpened()){						// true:视频/摄像头成功打开	
            printf("video open failed \r\n");
            return -1;
        }
    
        // cap.get(): 获取视频/摄像头的属性
        /*
        	1. 帧宽度(像素)
        	2. 帧高度(像素)
        	3. 帧率(FPS)
        	4. 总帧数(仅视频文件)
        
    		输出: width: 960, height: 720, fps: 30, frame_num: 904
    			视频总共:30s, 
    			现在:30张/s, 30*30=900,约等于904张。
        */
        int width = cap.get(CAP_PROP_FRAME_WIDTH); 
        int height = cap.get(CAP_PROP_FRAME_HEIGHT);
        double fps = cap.get(CAP_PROP_FPS);
        int frame_num = cap.get(CAP_PROP_FRAME_COUNT); 
    
        printf("width: %d, height: %d, fps: %d, frame_num: %d \r\n",
                width, height, fps, frame_num
        );
        Mat img;
        while(1){
            cap.read(img);
            imshow("img", img);
            waitKey(2);
        }
        return 0;
    }
    

1.4 OpenCV读取摄像头

int main()
{
    VideoCapture cap(0);			// 调用摄像头编号为0的摄像头
    Mat img;
    
    while(1){
        cap.read(img);
        imshow("imge", img);
        waitKey(2);
    }
}

1.5 OpenCV写视频

// 设置视频尺寸
    /* 1- Size:是一个类, 
    	framesize是它的对象
    */
cv::Size framesize(width, height); // 创建视频帧尺寸
// 1- fourcc图像格式	2- fps:输入帧数		3-framesize:设置视频尺寸
cv::VideoWriter writer(path, \
cv::VideoWriter::fourcc('I', '4', '2', '0'), fps, framesize); // 创建视频写入对象

1.5 自己绘制图形过程

// 1. 画矩形, 注意: 左上右下;颜色(BGR, 与常规的相反)
rectangle(img, Point(0,0), Point(100, 100), Scalar(0,0,255), 2); 
rectangle(img,             // 输入输出图像(要绘制矩形的图像)
          Point(0,0),      // pt1: 矩形左上角坐标 (x, y)
          Point(100,100),  // pt2: 矩形右下角坐标 (x, y)
          Scalar(0,0,255), // color: 颜色 (B, G, R) 格式,这里是红色
          2,               // thickness: 线宽(-1表示填充)、、、-1或FILLED是填充; 2表示粗细
		);


// 2. 输出文字, 注意:左下
putText(img, "hello world", Point(200,100), FONT_HERSHEY_DUPLEX, 0.75, Scalar(0,0,255), 2);
putText(img,                    // 输入输出图像
        "hello world",          // text: 要绘制的文本
        Point(200, 100),        // org: 文本左下角起点坐标 (x, y)
        FONT_HERSHEY_DUPLEX,    // fontFace: 字体类型
        0.75,                   // fontScale: 字体缩放因子
        Scalar(0,0,255),        // color: 文本颜色
        2,                      // thickness: 线宽
		)

	// 字体类型
    FONT_HERSHEY_SIMPLEX        // 普通大小无衬线字体(最常用)
    FONT_HERSHEY_PLAIN          // 小号无衬线字体
    FONT_HERSHEY_DUPLEX         // 复杂无衬线字体(比SIMPLEX更粗)
    FONT_HERSHEY_COMPLEX        // 复杂衬线字体
    FONT_HERSHEY_TRIPLEX        // 三倍衬线字体(比COMPLEX更粗)
    FONT_HERSHEY_COMPLEX_SMALL  // 小号复杂衬线字体
    FONT_HERSHEY_SCRIPT_SIMPLEX // 手写体(类似草书)
    FONT_HERSHEY_SCRIPT_COMPLEX // 复杂手写体

等待更新ing


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐