zoukankan      html  css  js  c++  java
  • 用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 "opencvcv.h"                          /* cvresize函数要用到 */
    #include "opencvhighgui.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;
    }

    效果:

    21-11-37-40

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    114. Flatten Binary Tree to Linked List
    odoo docker环境下将日志存储在数据库中ir_logging
    odoo 日志切割存储,日志存储到数据库中
    odoo 通过nginx反向代理后获取真实IP地址
    html样式超出长度部分使用省略号显示
    vim 查找字串所在的位置
    系统重启 后 Docker服务及容器自动启动设置
    字串格式化换format使用
    markdown 测试代码高亮
    协程与线程的简单区分
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3484942.html
Copyright © 2011-2022 走看看