C++封装opencv读取视频与摄像头的库

GetImage.h

#ifndef _GET_IMAGE_H_
#define _GET_IMAGE_H_

#include "opencv2/highgui.hpp"

using namespace cv;

#define FILENAMELEN 1000

typedef enum enGetImgMode
{
    GET_IMG_MODE_RECORD,
    GET_IMG_MODE_CAM
}GET_IMG_MODE_E;

typedef enum enGetImgWorkMode
{
    GET_IMG_WORK_MODE_ORC,              //获取原图
    GET_IMG_WORK_MODE_RESIZE_YUV420,    //获取缩放后的YUV420图
    GET_IMG_WORK_MODE_RESIZE_GRAY       //获取缩放后灰度图
}GET_IMG_WORK_MODE_E;

class GetImage
{
public:
    GetImage();
    GetImage(GET_IMG_MODE_E mode, GET_IMG_WORK_MODE_E workMode, int width, int height, char* pVideoPath);
    ~GetImage();

    int Work(Mat** ppstImage);
public:
    GET_IMG_MODE_E m_Mode;
    GET_IMG_WORK_MODE_E m_WorkMode;

    char m_VideoPath[FILENAMELEN];
    int m_Width;
    int m_Height;
    VideoCapture m_Capture;
    Mat m_OrcImg;
    Mat m_ScaleImg;
    Mat m_ScaleGrayImg;
};

#endif

GetImage.cpp

#include "GetImage.h"

#include "opencv2/video.hpp"

GetImage::GetImage()
{
    m_Mode = GET_IMG_MODE_CAM;
    m_WorkMode = GET_IMG_WORK_MODE_ORC;
    memset(&m_VideoPath[0], 0, sizeof(m_VideoPath[0])*FILENAMELEN);
    m_Width = 1280;
    m_Height = 720;
    m_Capture.open(0);
    m_ScaleImg.create(m_Width, m_Height, CV_8UC3);
    m_ScaleGrayImg.create(m_Width, m_Height, CV_8UC1);
}

GetImage::GetImage(GET_IMG_MODE_E mode, GET_IMG_WORK_MODE_E workMode, int width, int height, char* pVideoPath)
{
    m_Mode = mode;
    m_WorkMode = workMode;
    m_Width = width;
    m_Height = height;

    if (m_Mode == GET_IMG_MODE_RECORD)
    {
        memcpy(&m_VideoPath[0], pVideoPath, strlen(pVideoPath));
        m_VideoPath[strlen(pVideoPath)] = '\0';
        m_Capture.open(m_VideoPath);
    }
    else if (m_Mode == GET_IMG_MODE_CAM)
    {
        m_Capture.open(0);
    }

    m_ScaleImg.create(m_Width, m_Height, CV_8UC3);
    m_ScaleGrayImg.create(m_Width, m_Height, CV_8UC1);
}

GetImage::~GetImage()
{
    m_Capture.release();
}

int GetImage::Work(Mat** ppstImage)
{
    m_Capture >> m_OrcImg;
    if (m_OrcImg.empty())
    {
        (*ppstImage) = NULL;
        return 0;
    }

    //图像缩放
    if (m_WorkMode == GET_IMG_WORK_MODE_ORC)
    {
        *ppstImage = &m_OrcImg;
        return 0;
    }
    else if (m_WorkMode == GET_IMG_WORK_MODE_RESIZE_YUV420)
    {
        resize(m_OrcImg, m_ScaleImg, Size(m_Width, m_Height), (0, 0), (0, 0), INTER_AREA);
        *ppstImage = &m_ScaleImg;
        return 0;
    }
    else if (m_WorkMode == GET_IMG_WORK_MODE_RESIZE_GRAY)
    {
        resize(m_OrcImg, m_ScaleImg, Size(m_Width, m_Height), (0, 0), (0, 0), INTER_AREA);
        //转换为灰度图像
        cvtColor(m_ScaleImg, m_ScaleGrayImg, CV_BGR2GRAY);
        *ppstImage = &m_ScaleGrayImg;
        return 0;
    }

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值