/*-----------------------------------------------------------------------------
*  
*   版权声明:
*   可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
*   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的更多相关文章

  1. OpenCV计算机视觉学习(12)——图像量化处理&图像采样处理(K-Means聚类量化,局部马赛克处理)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 准备 ...

  2. 【20160924】GOCVHelper 图像增强部分(4)

    //使得rect区域半透明     Mat translucence(Mat src,Rect rect,int idepth){         Mat dst = src.clone();     ...

  3. 【20160924】GOCVHelper综述

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  4. 巧用 CSS 把图片马赛克化

    一.image-rendering 介绍 CSS 中有一个有趣的特性叫 image-rendering,它可以通过算法来更好地显示被缩放的图片. 假设我们有一张尺寸较小的二维码截图(下方左),将其放大 ...

  5. Python图像处理丨带你认识图像量化处理及局部马赛克特效

    摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...

  6. net-force.nl/steganography writeup

    做CTF题好长一段时间了,真的可以学到很多东西.这次,我们开启 net-force.nl 的 Steganography之旅,所谓的隐写术. level 801: Training - Can you ...

  7. (转)我如何利用前端技术得到 XXOO 网站的 VIP

    网页如图,这里只是说明整个网站的一些技术点,所以不该看的地方我都打上马赛克了,让我们揭开这些网站的整个前端工作原理首先刚进去的时候显示一堆乱七八糟的东西,点进去其中一个页面,下面各种虚假评论,然后每隔 ...

  8. canva实践小实例 —— 马赛克效果

    前面给大家带来了操作像素的API,此时此刻,我觉得应该配以小实例来进行进一步的说明和演示,以便给大家带来更宽广的视野和灵感,你们看了我的那么多的文章,应该是懂我的风格,废话不多说,进入正题: 这次给大 ...

  9. [转载]ios入门篇 -hello Word(1)

    温馨提示:,如果您使用移动终端阅读本篇文章,请连接wifi的情况下阅读,里面有大量图片,以免造成您不必要的损失.   潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评 ...

随机推荐

  1. HTML meta viewport属性说明

    什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手 ...

  2. 设置Tomcat应用自动部署目录

    只需要在Tomcat/conf目录下面新建文件夹Catalina/localhost,然后再localhost文件夹下面新建一个[应用名字.xml]文件即可,有多少个应用就新建多少个xml文件即可,x ...

  3. UIExtendedEdge

    在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局.就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEd ...

  4. OpenGL ES 3.0 基础知识

    首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系: 管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区.其中顶点 ...

  5. Python的字符串操作和Unicode

    字符串类型 str:Unicode字符串.采用''或者r''构造的字符串均为str,单引号可以用双引号或者三引号来代替.无论用哪种方式进行制定,在Python内部存储时没有区别. bytes:二进制字 ...

  6. Struts2WebUtil

    一个简单的实用工具类 package cn.jorcen.commons.util; import javax.servlet.http.HttpServletRequest; import org. ...

  7. [JavaScript] 用html5 js实现浏览器全屏

    项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的 效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以 让页面中的图片,视频等全屏目前只有g ...

  8. sjtu1313 太湖旅行

    Description 西山风景区是苏州著名的国家级风景区,一到暑假,游客们都蜂拥而至.作为太湖风景区的精华,西山景区吸引人的地方主要在它的群岛风光.花果丛林和名胜古迹. ginrat对这个地方向往已 ...

  9. [cc150] 括号问题

    Implement an algorithm to print all valid ( properly opened and closed) combinations of n-pairs of p ...

  10. HTTP错误代码详细介绍

    HTTP 400 - 请求无效 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 40 ...