一直对视频或者图像添加水印很感兴趣,查找资料后用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/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

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

  1. OpenCV Open Camera 打开摄像头

    这是一个用OpenCV2.4.10打开摄像头的一个例子,参见代码如下: #include <iostream> #include <stdio.h> #include < ...

  2. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  3. OpenCV学习 4:摄像头视频读写与边缘检测

    原创文章,欢迎转载,转载请注明出处 想实现人脸识别,车辆识别,车牌识别.一般我们可不是读硬盘里面的视频文件的,都是直接从摄像头读取视频流然后直接识别的.所以读取摄像头的视频流这是基础...OpenCV ...

  4. OpenCV学习记录之摄像头调用

    关于opencv调用摄像头的问题主要是因为摄像头的打开有延时.在显示图像前,要用if语句判断图像是否存在.(否则会报错) 具体的:教程里的源程序,将if条件句里,break去掉,并增加else语句. ...

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

    opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面. 这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件. 它们 ...

  6. 如何使用 OpenCV 打开摄像头获取图像数据?

    OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...

  7. OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)

    首先参照下面这里进行opencv x64位机器下面的配置 http://wiki.opencv.org.cn/index.php/VC_2010%E4%B8%8B%E5%AE%89%E8%A3%85O ...

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

    一.介绍 视频读取本质上就是读取图像,因为视频是由一帧一帧图像组成的.1秒24帧基本就能流畅的读取视频了. ①读取视频有两种方法: A. VideoCapture cap; cap.open(“1.a ...

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

    // TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat mathead ...

随机推荐

  1. WinRAR5.01注册码附注册机

    把下面的注册码复制到"记事本"中,另存为"rarreg.key"文件,放到WinRAR安装目录即完成注册.RAR registration datakjcy8U ...

  2. linux 下 查看是32位还是64位系统 命令

    文章引自:http://zhidao.baidu.com/question/583981849.html 方法1:getconf LONG_BIT 查看 如下例子所示: 32位Linux系统显示32, ...

  3. Java源码学习 -- java.lang.String

    java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang ...

  4. 关于JAVA自带MD5的方法

    有空再详细解释 import java.security.MessageDigest; public class MD5 { public final static String MD51(Strin ...

  5. Oracle 只导出某个用户下的表及数据

    今天某大牛问我要之前我参与的一个系统的代码及库,我捣鼓下,发给了他. 他很诧异的问:这个库有这么大么 我说 因为当时是专门新建了一个实例,用户也是系统用户,所以导出的时候是导出的整个数据库 他 ZZ ...

  6. Linux中重定向

    转:http://blog.csdn.net/songyang516/article/details/6758256 1重定向 1.1      重定向符号 >               输出 ...

  7. redis入门指南-附录A

  8. MySQL优化总结,百万级数据库优化方案

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. MysqlRouter 实现mysql5.6读写分离

    下载,安装   [root@localhost src]# cd /usr/local/src/ [root@localhost src]# wget http://dev.mysql.com/get ...

  10. python 基础篇 2

    三.对变量.对象与赋值的浅析 1.不记住就完蛋了 1.1 记住:一切数据都是对象 1.2 记住:一切变量都是对数据对象的一个引用 1.3 分析:python内部的引用计数 sys.getrefcoun ...