用opencv画矩形打上马赛克Mosaic
/*-----------------------------------------------------------------------------
*
* 版权声明:
* 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
* http://www.cnblogs.com/yuliyang/
* 联系方式:
* Mail:yuliyang@qq.com
*
*-----------------------------------------------------------------------------*/
代码:
/*
* =====================================================================================
*
* Filename: mashaike.cpp
*
* Description: 选取矩形区域打上Mosaic 按 ESC退出保存打上马赛克的图像
*
*
* Version: 1.0
* Created: 2013/12/21 11:26:22
* Author: yuliyang
*
* Mail: wzyuliyang911@gmail.com
* Blog: http://www.cnblogs.com/yuliyang
*
* =====================================================================================
*/ #include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
#include <math.h>
#include <time.h>
#include "opencv\cv.h" /* cvresize函数要用到 */
#include "opencv\highgui.h"
using namespace cv;
using namespace std;
struct tm *mytm=NULL; /* 以时间来命名保存文件 */
IplImage* org = 0; /* 原图 */
IplImage* img = 0; /* 打上马赛克操作图 */
IplImage* resize_img = 0; /* 如果图像大小太大了就resize,现在手机摄像头像素太高了 */ static int n=0;
static char savename[30]; /* 保存文件名 */
static time_t t;
void on_mouse( int event, int x, int y, int flags, void* ustc)
{
static CvPoint pre_pt = {-1,-1}; /* 矩形区域的第一个点 */
static CvPoint cur_pt = {-1,-1}; /* 第二个点 */
if( event == CV_EVENT_LBUTTONDOWN )
{
pre_pt = cvPoint(x,y);
}
else if( event == CV_EVENT_LBUTTONUP )
{
cur_pt = cvPoint(x,y);
int width=abs(pre_pt.x-cur_pt.x);
int height=abs(pre_pt.y-cur_pt.y);
CvRect rect;
if(pre_pt.x<cur_pt.x && pre_pt.y<cur_pt.y)
{
rect=cvRect(pre_pt.x,pre_pt.y,width,height);
}
else if(pre_pt.x>cur_pt.x && pre_pt.y<cur_pt.y)
{
rect=cvRect(cur_pt.x,pre_pt.y,width,height);
}
else if(pre_pt.x>cur_pt.x && pre_pt.y>cur_pt.y)
{
rect=cvRect(cur_pt.x,cur_pt.y,width,height);
}
else if(pre_pt.x<cur_pt.x && pre_pt.y>cur_pt.y)
{
rect=cvRect(pre_pt.x,cur_pt.y,width,height);
}
cvSetImageROI(img,rect);
int W=8;
int H=8; /*------------------------------------------------------------------------------------------------------------
* 打上马赛克
*------------------------------------------------------------------------------------------------------------*/
for(int mi=W;mi<img->roi->width;mi+=W)
for(int mj=H;mj<img->roi->height;mj+=H)
{
CvScalar tmp=cvGet2D(img,mj-H/2,mi-W/2);
for(int mx=mi-W;mx<=mi;mx++)
for(int my=mj-H;my<=mj;my++)
cvSet2D(img,my,mx,tmp);
}
cvResetImageROI(img); }
}
int main(int argc, char *argv[])
{
org=cvLoadImage(argv[1],1); /* 载入图像 */ if(org->width > 1000) /* 太大缩放 */
{
CvSize dst_cvsize;
dst_cvsize.width=org->width*0.2;
dst_cvsize.height=org->height*0.2;
img = cvCreateImage( dst_cvsize, org->depth, org->nChannels);
resize_img=cvCloneImage(org);
cvResize(resize_img, img, CV_INTER_LINEAR);
}
else{
img=cvCloneImage(org);
} cvNamedWindow("org",CV_WINDOW_AUTOSIZE);
cvShowImage("org",org);
cvNamedWindow("img",CV_WINDOW_AUTOSIZE); cvSetMouseCallback( "img", on_mouse, 0 );
while(1){ cvShowImage("img",img);
char c=(char)waitKey(47);
if (c==27)
{ time(&t);
mytm = localtime(&t);
sprintf(savename,"%d-%d-%d-%d.jpg",mytm->tm_mday,mytm->tm_hour,mytm->tm_min,mytm->tm_sec);
cvSaveImage(savename,img);
break;
} } cvDestroyAllWindows();
cvReleaseImage(&org);
cvReleaseImage(&img);
return 0;
}
效果:
用opencv画矩形打上马赛克Mosaic的更多相关文章
- OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...
- 【20160924】GOCVHelper 图像增强部分(4)
//使得rect区域半透明 Mat translucence(Mat src,Rect rect,int idepth){ Mat dst = src.clone(); ...
- 【20160924】GOCVHelper综述
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- 巧用 CSS 把图片马赛克化
一.image-rendering 介绍 CSS 中有一个有趣的特性叫 image-rendering,它可以通过算法来更好地显示被缩放的图片. 假设我们有一张尺寸较小的二维码截图(下方左),将其放大 ...
- Python图像处理丨带你认识图像量化处理及局部马赛克特效
摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...
- net-force.nl/steganography writeup
做CTF题好长一段时间了,真的可以学到很多东西.这次,我们开启 net-force.nl 的 Steganography之旅,所谓的隐写术. level 801: Training - Can you ...
- (转)我如何利用前端技术得到 XXOO 网站的 VIP
网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔 ...
- canva实践小实例 —— 马赛克效果
前面给大家带来了操作像素的API,此时此刻,我觉得应该配以小实例来进行进一步的说明和演示,以便给大家带来更宽广的视野和灵感,你们看了我的那么多的文章,应该是懂我的风格,废话不多说,进入正题: 这次给大 ...
- [转载]ios入门篇 -hello Word(1)
温馨提示:,如果您使用移动终端阅读本篇文章,请连接wifi的情况下阅读,里面有大量图片,以免造成您不必要的损失. 潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评 ...
随机推荐
- 使用phpize安装php模块
1.下载包 2./usr/local/php/bin/phpize 3../configure --enable-soap --with-php-config=/usr/local/php/bin/ ...
- easy-ui datagrid
Easy-ui引用 <link href="css/EasyUI/themes/icon.css" rel="stylesheet" type=&q ...
- WPF自定义控件之仿Win8滚动条--ScrollViewer
1.说明 自己学习WPF不是很久,现将自己做的一些小项目中用到的自定义控件整理出来,方便以后使用,不尽人意之处,还请多多批评与指导,现在就来实现自定义ScrollViewer仿Win8滚动条 2.效果 ...
- This transaction has been rolled back, rather than only the current.
今天上午,收到运维组同事反映某应用系统的其中一个功能报错,不是偶然性事件,每个使用该功能的用户都报错.报错内容为:This transaction has been rolled back, rath ...
- 【转】oracle 针对中文字段进行排序
1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 select ...
- 属性观察者willSet与didSet
在Swift中使用willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化. willSet里面是新值,即属性即将要变为的值:didSet里面是旧值,即属性变化之前的值. impor ...
- cocos2dx 3.4 截图代码
Size size = Director::sharedDirector()->getWinSize(); //定义一个屏幕大小的渲染纹理 RenderTexture* pScreen = Re ...
- 软媒魔方u盘装系统
http://jingyan.baidu.com/article/d5a880eb6e747e13f147ccd6.html
- Oracle学习笔记1: 表与约束
1. 登录SQL Plus: 系统用户有哪些: 1. sys,system权限比较高的用户: 2. sysman操作企业管理器使用的. 1.2 的密码是安装oracle是设置的. 3. scott用户 ...
- HDU 2369 Broken Keyboard(字符串)
点我看题目 题意 : 这个人的键盘坏了,最多只能按n个键,给你一串字符串,问你找一个最长的字串,这个字串中包含的不同的字母不能超过n个. 思路 : 比赛的时候脑子没转过来,一直没模拟出来,都不知道怎么 ...