C语言 回调函数编写与应用

该代码示例展示了如何使用回调函数处理RTSP摄像头流。在C++中,定义了一个结构体`rtspCameraData`来存储帧数据,并声明了一个回调函数类型`callback`。`openRtspCamera`函数打开RTSP流,读取帧,并通过回调函数传递给`getCameraData`进行处理,如保存为图片。`stopRtspCamera`用于停止流。主函数中调用这些功能并显示处理结果。
摘要由CSDN通过智能技术生成

回调函数使用:以视频推拉流为例

h文件:

#ifndef RTSPCAMERA_H
#define RTSPCAMERA_H

#include <iostream>
#include <string.h>

using namespace std;

#define RTSPCAMERA extern "C" __declspec(dllexport)

struct rtspCameraData
{
    int width;
    int height;
    int length;
    unsigned char* data;
} ;

typedef void (*callback)(struct rtspCameraData* data);


RTSPCAMERA bool __stdcall openRtspCamera(string path, callback func);


RTSPCAMERA void __stdcall stopRtspCamera();

#endif // RTSPCAMERA_H

cpp文件:

#include "rtspcamera.h"
#include <opencv2/opencv.hpp>
using namespace cv;

static VideoCapture capture;
static Mat image;
static int frame_cnt = 0;
static bool isGetRtspCamera = false;

bool __stdcall openRtspCamera(string path, callback func)
{
    capture.open(path);

    if(!capture.isOpened())
        return false;

    isGetRtspCamera = true;

    struct rtspCameraData data;

    while (isGetRtspCamera) {
        if((frame_cnt % 8) == 0) {
            capture.read(image);
        }
        else {
            capture.grab();
        }

        frame_cnt ++;

        data.width = capture.get(CAP_PROP_FRAME_WIDTH);
        data.height = capture.get(CAP_PROP_FRAME_HEIGHT);
        data.data = image.data;
        data.length = image.rows * image.cols * image.elemSize();

//        cout<<"width: "<<data.width
//             <<"\nheight: "<<data.height
//             <<"\nsize: "<<data.length
//             <<"\nfps: "<<capture.get(CAP_PROP_FPS)<<endl;

        func(&data);
    }

    return true;
}

void __stdcall stopRtspCamera()
{
    isGetRtspCamera = false;
    capture.release();
}

main.cpp

#include <opencv2/opencv.hpp>
#include "rtspcamera.h"

using namespace cv;

int ss = 0;
void getCameraData(struct rtspCameraData *cameradata)
{
    //while(true) {
        Mat image = cv::Mat(cameradata->height, cameradata->width, CV_8UC3, cameradata->data);

        //namedWindow("image", WINDOW_AUTOSIZE);
        //imshow("image", image);
        ss ++;
        QString str = QString::number(ss) + ".png";
        imwrite(str.toStdString(), image);

//        cout<<"width: "<<cameradata->width
//                 <<" height: "<<cameradata->height
//                 <<" size: "<<cameradata->length
//                 <<" data: "<<cameradata->data<<endl;

        //waitKey(1);
    //}
}

int main(int argc, char *argv[])
{
    bool ret = openRtspCamera("rtsp://admin:admin@192.168.1.110:554/ch1/main/av_stream", getCameraData);
    if(ret == false) {
        cout<<"open rtsp error."<<endl;
    }

    while (true) {
        waitKey(1);
    }

    stopRtspCamera();

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值