/*-----------------------------------------------------------------------------
*  
*   版权声明:
*   可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
*   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. csdn博客刷点击率代码

    此文为转载,亲测有效. import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; impo ...

  2. jquery-easyui使用

    1,闲来无事用了一下jquery-easyui,首先下载下来easyui,文件夹如图 2,将themes里面的东西整体拷贝,我是整体的,省的麻烦了 3,在在自己的vs里面新建一个mvc的项目(项目自己 ...

  3. json 筛选数据 $.grep过滤数据

    var data = { status: "ok", image_size_list: [ { image_size_id: "22", ad_class: & ...

  4. javascripct数组

    定义数组 数组对象用来在单独的变量名中存储一系列的值. 我们使用关键词 new 来创建数组对象.下面的代码定义了一个名为 myArray 的数组对象: var myArray=new Array() ...

  5. ecshop二次开发 给商品添加自定义字段

    说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. 抱着这种想法我在Ecshop的后台一顿找,不过肿么都木 ...

  6. 走进WCF一 (异常如此多娇,引无数码农竞折煞)

    对于WCF一直都是只知其然,公司框架的架构者也只是对我们授之以鱼,而不授之以渔. 带着初学者的态度进入了大神Artech的博客,逐步慢慢上手. 我的解决方案(和大神的一模一样,只是过程中一波三折的) ...

  7. poj 1904 King's Quest

    King's Quest 题意:有N个王子和N个妹子;(1 <= N <= 2000)第i个王子喜欢Ki个妹子:(详见sample)题给一个完美匹配,即每一个王子和喜欢的一个妹子结婚:问每 ...

  8. Weex详解:灵活的移动端高性能动态化方案

    原文地址:http://www.infoq.com/cn/articles/introducing-weex 在2016年4月份的QCon上,阿里巴巴资深总监,淘宝移动平台及新业务事业部.阿里百川负责 ...

  9. Asp.net MVC 视图之公用代码

    一.公共模板 转自:http://www.cnblogs.com/kissdodog/archive/2013/01/07/2848881.html 1.@RenderBody() 在网站公用部分通过 ...

  10. DJANGO模板的BLOCK自定义技巧

    除了INCLUDE, EXTENDS基本的继承模板之外,如果想在本模板上,直接生成让同类页面继承的模板, 则可以需要自定义的地方实现自定义BLOCK, 先在本页面实现自己的BLOCK,然后,在继承的页 ...