opencv调用电脑摄像头+视频拼接

1.opencv调用电脑摄像头
在利用opencv做视频处理时,我们可以直接调用电脑摄像头,也可以读取视频数据来做处理,opencv也提供了相应的链接库。
int cameraNumber = 0;
if (argc>1)
cameraNumber = atoi(argv[1]);//get camera number
printf(“photo Number=%d”, cameraNumber);
cv::VideoCapture camera;
camera.open(cameraNumber); //open the camera by cameraNumber:0
if (!camera.isOpened()) //checkout the camera equipment
{
std::cout << “ERROPR” << endl;
exit(1);
}
2.视频拼接:
在利用电脑监控多台摄像头设备时,通常会看到在电脑屏幕上同时显示了对个摄像头的场景画面,我们可以利用“定义兴趣区域”的方式来实现视频数据拼接。
具体实现方法:视频数据可以理解成连续的图像数据来处理,首先我们可以创建一个空白图像,再将视频数据转化成图像数据,经过缩放至合适的尺寸,以“定义兴趣区域”的方式,将图片移至我们建立的空白图像,通过循环的获取视频图像,显示拼接好的图像,就可以动态的查看多个摄像头或视频了,示意图如图所示
这里写图片描述
工程实例:
1. 打开电脑摄像头
2. 读取视频数据
3. 将摄像头、视频数据转化成图像数据
4. 进行图像拼接(图像基本处理,图像缩放)
5. 显示拼接好的图片,达到视频拼接的效果

实例效果(本人长相“平平无奇”,用了一点小技巧给处理了一下):
效果展示:(在自己电脑上运行时将看到的是实时的视频显示)
这里写图片描述

示例代码:

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

void colorBinary(const cv::Mat orig_image, cv::Mat &mod_image, int R_THRE = 120, int G_THRE = 100, int B_THRE = 100)
{
    int nl = orig_image.rows;
    int nc = orig_image.cols;// *mod_image.channels();
    //std::cout << "rows=" << nl << "clos=" << nc << endl;
    cv::Mat testImage(nl, nc, CV_8UC3, cv::Scalar(0, 0, 255));
    //mod_image = testImage;

    for (int i = 0; i < nl; i++)
    {
        for (int j = 0; j < nc; j++)
        {
            if (orig_image.at<cv::Vec3b>(i, j)[0] > B_THRE&&
                orig_image.at<cv::Vec3b>(i, j)[1] > G_THRE&&
                orig_image.at<cv::Vec3b>(i, j)[2] > R_THRE
                )
            {
                testImage.at<cv::Vec3b>(i, j)[0] = 255;
                testImage.at<cv::Vec3b>(i, j)[1] = 255;
                testImage.at<cv::Vec3b>(i, j)[2] = 255;
            }
            else
            {
                testImage.at<cv::Vec3b>(i, j)[0] = 0;
                testImage.at<cv::Vec3b>(i, j)[1] = 0;
                testImage.at<cv::Vec3b>(i, j)[2] = 0;
            }
        }
    }
    mod_image = testImage;
}
int main(int argc, char *argv[])
{
    cv::Mat source;
    cv::Mat image;
    cv::Mat  cameraFrame;
    cv::Mat showImage;
    cv::Mat imagebuf[4];
    cv::Mat turns;

    int cameraNumber = 0;
    if (argc>1)
        cameraNumber = atoi(argv[1]);//get camera number
    printf("photo Number=%d", cameraNumber);
    cv::VideoCapture  camera;   
    camera.open(cameraNumber);  //open the camera by cameraNumber:0
    if (!camera.isOpened())     //checkout the camera equipment
    {
        std::cout << "ERROPR" << endl;
        exit(1);
    }
    cv::VideoCapture cap;
    cap.open("video2.mp4");
    if (!cap.isOpened())
    {
        cout << "can't open mp4 file" << endl;
    }
    while (1)
    {
        cap >> source;
        if (source.empty())
        {
            cout << "error mp4" << endl;
        }
        /*image size setting*/
        cv::resize(source, source, cv::Size(source.cols/ 2, source.rows /1.5 ));

        camera >> cameraFrame;
        if (cameraFrame.empty())
        {
            cout << "error!" << endl;
            exit(1);
        }

        /*transform video data into image data*/
        cv::cvtColor(cameraFrame, imagebuf[0], 1);
        cv::cvtColor(cameraFrame, imagebuf[1], 1);
        cv::cvtColor(source, imagebuf[2], 1);
        cv::cvtColor(source, imagebuf[3], 1);

        cv::Mat windowShow(960, 1280, CV_8UC3, cv::Scalar(0, 0, 255));

        cv::threshold(imagebuf[0], imagebuf[0], 70, 255, CV_THRESH_BINARY);
        cv::Mat imageROI0(windowShow, cv::Rect(0, 0, imagebuf[0].cols, imagebuf[0].rows));
        imagebuf[0].copyTo(imageROI0);

        cv::GaussianBlur(imagebuf[1], imagebuf[1], cv::Size(5, 5), 0);
        //RGB image binarization processing
        colorBinary(imagebuf[1], turns,70,50,43);
        cv::Mat imageROI1(windowShow, cv::Rect(0, imagebuf[0].rows, imagebuf[0].cols, imagebuf[0].rows));
        turns.copyTo(imageROI1);

        cv::Mat imageROI2(windowShow, cv::Rect(imagebuf[0].cols, 0, imagebuf[0].cols, imagebuf[0].rows));
        imagebuf[2].copyTo(imageROI2);

        cv::GaussianBlur(imagebuf[3], imagebuf[3], cv::Size(5, 5), 0);
        colorBinary(imagebuf[3], turns,72,58,66);
        cv::Mat imageROI3(windowShow, cv::Rect(imagebuf[0].cols, imagebuf[0].rows, imagebuf[0].cols, imagebuf[0].rows));
        turns.copyTo(imageROI3);

        //scale to the appropriate display pixel
        cv::resize(windowShow, showImage, cv::Size(windowShow.cols / 1.4, windowShow.rows / 1.4));
        cv::namedWindow("windowShow");
        cv::imshow("windowShow", showImage);

        char key = cv::waitKey(100);
        if (key == 27)  //press the ESC button and exit the paly!
        {
            cout << "ESC !!!" << endl;
            exit(0);
        }
    }
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值