OpenCV学习1-----打开摄像头并在画面上添加水印

一直对视频或者图像添加水印很感兴趣,查找资料后用OpenCV尝试了一下。

记录下来。

1.首先是打开摄像头。

找到OpenCV官方文档给出的例子

例子中实现的是,打开摄像头,并对画面进行高斯滤波,使用canny算子检测直线边缘。

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

2.打开摄像头后,接下来是想在画面上添加水印,图片之类。类似于电视画面上的台标。

查找到addWeighted函数。

如下是OpenCV官方文档给出的关于addWeighted的例子。

能够将两幅图像添加到一起,但是要求尺寸是一样的。

如下分别是原图像,要添加的图像,最后效果图像。

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace cv;

int main( int argc, char** argv )
{
 double alpha = 0.5; double beta; double input;

 Mat src1, src2, dst;

 /// Ask the user enter alpha
 std::cout<<" Simple Linear Blender "<<std::endl;
 std::cout<<"-----------------------"<<std::endl;
 std::cout<<"* Enter alpha [0-1]: ";
 std::cin>>input;

 /// We use the alpha provided by the user if it is between 0 and 1
 if( input >= 0.0 && input <= 1.0 )
   { alpha = input; }

 /// Read image ( same size, same type )
 src1 = imread("../../images/LinuxLogo.jpg");
 src2 = imread("../../images/WindowsLogo.jpg");

 if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
 if( !src2.data ) { printf("Error loading src2 \n"); return -1; }

 /// Create Windows
 namedWindow("Linear Blend", 1);

 beta = ( 1.0 - alpha );
 addWeighted( src1, alpha, src2, beta, 0.0, dst);

 imshow( "Linear Blend", dst );

 waitKey(0);
 return 0;
}

有了上边的例子后,经过修改,最终如下。

int opencvcamera()
{
    VideoCapture cap(0); // open the default camera
    if (!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("bjuttv", 1);
    Mat logo = imread("Arcteryx_logo.jpg");
    pyrDown(logo, logo, Size(logo.cols / 2, logo.rows / 2));
    Mat graylogo = imread("Arcteryx_logo.jpg", 0);
    pyrDown(graylogo, graylogo, Size(graylogo.cols / 2, graylogo.rows / 2));
    for (;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        Mat imageROI = frame(Rect(0, 0, graylogo.cols, graylogo.rows));    

        addWeighted(imageROI, 0.7, logo, 0.3, 0., imageROI);
        //logo.copyTo(imageROI, graylogo);
        //logo.copyTo(imageROI);
        imshow("bjuttv", frame);
        if (waitKey(30) >= 0) break;
    }
}

程序中其实也可以用copyTo,将logo拷贝到感兴趣区域imageROI中。

pyrDown()是OpenCV提供的图像金字塔函数,用来下采样,减小图片尺寸。

稍微调节以后就得到如下效果。

参考:

http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture

http://docs.opencv.org/2.4/doc/tutorials/core/adding_images/adding_images.html

时间: 06-09

OpenCV学习1-----打开摄像头并在画面上添加水印的相关文章

opencv学习---打开摄像头检测个人头像

opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面. 这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件. 它们分别是: 检测头像 haarcascade_frontalface_alt.xml或者haarcascade_frontalface_alt2.xml 检测眼睛 haarcascade_eye.xml或者haarcascade_eye_tree_eyeglasses.xml 检测用的函数是: cvH

opencv打开摄像头获取视频程序

// // main.cpp // opencv3 // // Created by PKU on 14-9-16. // Copyright (c) 2014年 PKU. All rights reserved. // #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() { CvCapture* capture=cvCaptureFromCAM(-1); CvVideoWriter

opencv学习之路(2)、读取视频,读取摄像头

一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open("1.avi"); B. VideoCapture cap("1.avi"); ②循环显示每一帧: while(1) { Mat frame; //定义Mat变量,用来存储每一帧 cap>>frame; //读取当前帧方法一 //cap.read(frame); /

OpenCV实践之路——MFC与OpenCV联合打开摄像头

在之前的一篇博客中已经记录了如何打开一张图片,能打开图片之后,自然就是尝试打开摄像头.在之前打开图片的时候已经知道了怎么应用按钮控件和图片控件,虽然都没记录...最最重要的是,知道了怎么让MFC与OpenCV的数据交互--Mat与CImage相互转换.有了之前的基础,打开摄像头就可以得心应手了.还是直接上代码,然后再说问题: void CMFCtestDlg::OnBnClickedButton1() { // TODO: Add your control notification handle

opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)

// TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat matheader; CvMat * mat = cvGetMat(img, &matheader); CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3); cvConvert(img, mat) IplImage -> Mat

OpenCV打不开摄像头的替代解决方案

一般来说,opencv要打开摄像头的话,可以使用:VideoCapture captRefrnc(0); 这类方式. 重装系统之后,为了避免安装巨大的visual studio,改成了codeblocks,另外opencv也采用cmake+codeblocks的方式编译而成,但是采用默认设置编译出来的opencv无法开启笔记本电脑的摄像头,尝试其他解决方法之后,想到了之前用过的 K-Lite Codec Pack 配合avisynth编写avs脚本解决解码器的思路,利用K-Lite Codec

OpenCV学习笔记(一)安装及运行第一个OpenCV程序

1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以找到个版本和各种平台的程序包.OpenCV的Windows平台安装包是放在SourceForge.net网站. 我下了2.4.4版,大概217M.安装包其实就是一个压缩包,安装过程就是解压到某个文件夹.我是安装到 E:\Soft\opencv 目录,安装后文件夹如下: 我们只需要关注“build”文

OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)

昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述一下步骤吧: 一.安装前准备 1.VS2012(网上看到很多用的VS2010,但是基本不影响) 2.OpenCV 安装包(我下载的是最新的2.4.9) 二.安装OpenCV 1.解压OPenCV 说是安装,其实就是解压,OpenCV的Windows安装程序就是一个自解压程序: 这里我解压到C:\Pr

基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

基于opencv和mfc的摄像头采集框架(GOMFCTemplate2) 编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的. 基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架.具有以下特点: 1.基于directshow,兼容性好,速度快.到目前为止,无论是工业相机还是普通相机,没发现不兼容的: 2.摄像头部分通过线程读取,保证界面的运行流畅: