OpenCV学习1-----打开摄像头并在画面上添加水印
一直对视频或者图像添加水印很感兴趣,查找资料后用OpenCV尝试了一下。
记录下来。
1.首先是打开摄像头。
找到OpenCV官方文档给出的例子。
例子中实现的是,打开摄像头,并对画面进行高斯滤波,使用canny算子检测直线边缘。

#include "opencv2/opencv.hpp" using namespace cv; int main(int, char**)
{
VideoCapture cap(); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -; Mat edges;
namedWindow("edges",);
for(;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(,), 1.5, 1.5);
Canny(edges, edges, , , );
imshow("edges", edges);
if(waitKey() >= ) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return ;
}
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 -; }
if( !src2.data ) { printf("Error loading src2 \n"); return -; } /// Create Windows
namedWindow("Linear Blend", ); beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst); imshow( "Linear Blend", dst ); waitKey();
return ;
}
有了上边的例子后,经过修改,最终如下。
int opencvcamera()
{
VideoCapture cap(); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -; Mat edges;
namedWindow("bjuttv", );
Mat logo = imread("Arcteryx_logo.jpg");
pyrDown(logo, logo, Size(logo.cols / , logo.rows / ));
Mat graylogo = imread("Arcteryx_logo.jpg", );
pyrDown(graylogo, graylogo, Size(graylogo.cols / , graylogo.rows / ));
for (;;)
{
Mat frame;
cap >> frame; // get a new frame from camera
Mat imageROI = frame(Rect(, , graylogo.cols, graylogo.rows)); addWeighted(imageROI, 0.7, logo, 0.3, ., imageROI);
//logo.copyTo(imageROI, graylogo);
//logo.copyTo(imageROI);
imshow("bjuttv", frame);
if (waitKey() >= ) break;
}
}
程序中其实也可以用copyTo,将logo拷贝到感兴趣区域imageROI中。
pyrDown()是OpenCV提供的图像金字塔函数,用来下采样,减小图片尺寸。
稍微调节以后就得到如下效果。

参考:
http://docs.opencv.org/2.4/doc/tutorials/core/adding_images/adding_images.html
OpenCV学习1-----打开摄像头并在画面上添加水印的更多相关文章
- OpenCV Open Camera 打开摄像头
这是一个用OpenCV2.4.10打开摄像头的一个例子,参见代码如下: #include <iostream> #include <stdio.h> #include < ...
- 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- OpenCV学习 4:摄像头视频读写与边缘检测
原创文章,欢迎转载,转载请注明出处 想实现人脸识别,车辆识别,车牌识别.一般我们可不是读硬盘里面的视频文件的,都是直接从摄像头读取视频流然后直接识别的.所以读取摄像头的视频流这是基础...OpenCV ...
- OpenCV学习记录之摄像头调用
关于opencv调用摄像头的问题主要是因为摄像头的打开有延时.在显示图像前,要用if语句判断图像是否存在.(否则会报错) 具体的:教程里的源程序,将if条件句里,break去掉,并增加else语句. ...
- opencv学习---打开摄像头检测个人头像
opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面. 这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件. 它们 ...
- 如何使用 OpenCV 打开摄像头获取图像数据?
OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...
- OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)
首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...
- opencv学习之路(2)、读取视频,读取摄像头
一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open(“1.a ...
- opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)
// TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat mathead ...
随机推荐
- JAVA虚拟机系列文章
本系列文章主要记录自己在学习<深入理解Java虚拟机-JVM高级特性与最佳实践>的知识点总结,文章内容都是基于周志明所著书籍的总结. 1.Java内存区域与溢出 2.垃圾收集器与内存分配策 ...
- Java中线程的实现:
Java中线程的实现: 一.线程简介: 实现的两种方式为: 1.Thread类 2.Runnable接口 都在java.lang中 都有共通的方法:public void run() 二.线程常用方法 ...
- JDK版本会影响项目部署
最近在公司里面部署javaweb项目的时候,项目启动的时候报错,我使用了各种方法来寻找答案,将近花了很长的时间.就在今天我终于找到了问题的根源,我开始用的是JDK1.8的版本,换了一个1.7版本的JD ...
- Tensorflow实践:CNN实现MNIST手写识别模型
前言 本文假设大家对CNN.softmax原理已经比较熟悉,着重点在于使用Tensorflow对CNN的简单实践上.所以不会对算法进行详细介绍,主要针对代码中所使用的一些函数定义与用法进行解释,并给出 ...
- H5水果机,一个网络版的lao hu ji
该游戏为h5小游戏,纯属娱乐,技术探讨,相关技术在文章结尾,欢迎探讨交流 花了几天时间开发了这款水果lao hu ji,更新了几个版本,还有不足的地方,由于时间有限暂时没有继续更新新版本 未完成的功能 ...
- 利用shell脚本监控目录内文件改动
#! /bin/bash webroot="/home/www/" cp /dev/null rsync_file if [ ! -f file.md5 ];then ...
- window.opener的用法
window.opener 主要用来打开窗体的父窗体,可以通过这种方式设置父窗体的值或者调用js方法. 例如: 1,window.opener.test(); ---调用父窗体中的test()方法 2 ...
- Vue.js高仿饿了么WebApp
介绍 学习Vue.js也有一阵子了,为了加深对Vue的理解及运用,做了一个小项目.这是一个高仿饿了么外卖WebApp,现已完成商品预览.商品详情.商家预览.添加购物.查看评论等功能. 部分截图 项目预 ...
- 将Java Web项目部署到远程主机上
这里讲的是Java Web项目 第一步:购买主机,如果是大学生可以购买学生机,一个月9.9元,阿里云ECS服务器,自己选择不同的操作系统和镜像 ,我的选择 得到用户名和密码,可以进行ssh远程登录,登 ...
- nodeJS之fs文件系统
前面的话 fs文件系统用于对系统文件及目录进行读写操作,本文将详细介绍js文件系统 概述 文件 I/O 是由简单封装的标准 POSIX 函数提供的. 通过 require('fs') 使用该模块. 所 ...