用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的情况下阅读,里面有大量图片,以免造成您不必要的损失. 潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评 ...
随机推荐
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- HBase Shell(转)
HBase 为用户提供了一个非常方便的使用方式, 我们称之为“HBase Shell”.HBase Shell 提供了大多数的 HBase 命令, 通过 HBase Shell 用户可以方便地创建.删 ...
- OpenFileDialog组件打开文件....待续
1.常用属性 InitialDirectory 对话框的初始目录 this.openFileDialog1.InitialDirectory = "d:\\"; ...
- qt 5 数据库操作(mysql)
其实大家都知道,QT5以上的都自带了数据库驱动,所以呢,基本上可以直接使用,于是如果想知道怎么连接数据库,请参考这位大神写的.http://qtdebug.com/DB-AccessMySQL.htm ...
- gradient css
<!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...
- Hbase 0.96 比 hbase 0.94的改变
转载:http://blog.csdn.net/hxpjava1/article/details/20043703 环境: hadoop:hadoop-2.2.0 hbase:hbase-0.96.0 ...
- codeforces 387C George and Number
这道题目的意思是对于每个要删除的数字,向前或向后找到一块连续的数字,而它是其中最小的: 很容易看出对于所有要先删除的数字要从大到小删除: 然后对于每个要删除的字母,要找到比他小的,但是在原数列中又靠它 ...
- 关联规则算法Apriori的学习与实现
转自关联规则算法Apriori的学习与实现 首先我们来看,什么是规则?规则形如"如果-那么-(If-Then-)",前者为条件,后者为结果.关联规则挖掘用于寻找给定数据集中项之间的 ...
- DataTable转换List<T>集合的方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data; ...
- loadrunner 怎么能得到返回的http状态?
loadrunner如何保存从服务器传回来的http头的信息? Action() { int HttpRetCode; web_url("www.hao123.com", &quo ...