C++实现的马赛克类

    年前在一个网站上看到一个项目,对视频流进行时时打码处理,很有意思。本人利用过年时间写了个C++实现的马赛克类,娱乐一下。

    环境:vs2008 + opencv2.0

头文件Mosaic.h

////////////////////////////////// //功能:对图像进行马赛克处理 //作者:enjoy //时间:2010年02月16日 //版本:alpha 1.0.1 //改进:对边缘处处理失效的问题 // 进行了修改 ////////////////////////////////// #include "cxcore.h" class Mosaic { private: int threshold[90][90]; public: Mosaic(void); //生成半径为r的掩模矩阵 // Mosaic(int r); ~Mosaic(void); //马赛克处理 //原始图像src 处理后的图像dst 掩模半径radius // void maskon(IplImage * src, IplImage * dst, int radius); };

 

 

CPP文件Mosaic.cpp 

////////////////////////////////// //功能:对图像进行马赛克处理 //作者:enjoy //时间:2010年02月16日 //版本:alpha 1.0.1 //改进:对边缘处处理失效的问题 // 进行了修改 ////////////////////////////////// #include "StdAfx.h" #include "Mosaic.h" Mosaic::Mosaic(void) { } //生成半径为r的掩模矩阵 // Mosaic::Mosaic(int r) { //掩模矩阵的半高 // int h_t = (int)(3 * (r - 1) / 2); //掩模矩阵的半宽 // int w_t = r - 1; //掩模矩阵初始化 // for (int i = - h_t; i<= h_t; i++) for (int j = - w_t; j <= w_t; j++) threshold[i + h_t][j + w_t] = 0; //生成掩模矩阵 // for (int i = - h_t; i<= h_t; i++) { if (i < - h_t + r) { for (int j = - w_t; j <= w_t; j++) if (j >= (- h_t - i) && j <= (h_t + i)) threshold[i + h_t][j + w_t] = 1; } else if (i > h_t - r) { for (int j = - w_t; j <= w_t; j++) if (j >= (- h_t + i) && j <= (h_t - i)) threshold[i + h_t][j + w_t] = 1; } else { for (int j = - w_t; j <= w_t; j++) threshold[i + h_t][j + w_t] = 1; } } } Mosaic::~Mosaic(void) { } //马赛克处理 //原始图像src 处理后的图像dst 掩模半径radius // void Mosaic::maskon(IplImage *src, IplImage *dst, int r) { //图像高度 // int h = src->height; //图像宽度 // int w = src->width; int thr = 0; int thg = 0; int thb = 0; //马赛克晶格行数 // int row = 0; //马赛克晶格列数 // int col = 0; int flag_row = 1; int flag_col = 1; //晶格行数对应图像行数 // int cor_row = 0; //晶格列数对应图像列数 // int cor_col = 0; //掩模矩阵的半高 // int h_t = (int)(3 * (r - 1) / 2); //掩模矩阵的半宽 // int w_t = r - 1; //行坐标偏移 // int cor_shift_row = 0; //列坐标偏移 // int cor_shift_col = 0; while (flag_row) { cor_row = (2 * r - 1) * row - (int)((r - 1) / 2); if (cor_row >= h) flag_row = 0; if (cor_row < 0) cor_shift_row = - cor_row; else if (cor_row >= h) cor_shift_row = h - cor_row - 1; else cor_shift_row = 0; uchar * ptr_s = (uchar *)(src->imageData + (cor_row + cor_shift_row) * src->widthStep); flag_col = 1; col = 0; while (flag_col) { if (row % 2 == 1) cor_col = 2 * r * col - r; else cor_col = 2 * r * col; if (cor_col >= w) flag_col = 0; if (cor_col < 0) cor_shift_col = - cor_col; else if (cor_col >= w) cor_shift_col = w - cor_col - 1; else cor_shift_col = 0; //得到晶格矩阵中心对应图像像素点的 //RGB颜色 // thb = ptr_s[3 * (cor_col + cor_shift_col)]; thg = ptr_s[3 * (cor_col + cor_shift_col) + 1]; thr = ptr_s[3 * (cor_col + cor_shift_col) + 2]; //掩模矩阵值为1时,图像对应区域像素操作 // for (int i = - h_t; i <= h_t; i++) { if ((cor_row + i) >= h || (cor_row + i) < 0) continue; uchar * ptr_d = (uchar *)(dst->imageData + (cor_row + i) * dst->widthStep); for (int j = - w_t; j <= w_t; j++) { if ((cor_col + j) >= w || (cor_col + j) < 0) continue; if (threshold[i + h_t][j + w_t]) { ptr_d[3 * (cor_col + j)] = thb; ptr_d[3 * (cor_col + j) + 1] = thg; ptr_d[3 * (cor_col + j) + 2] = thr; } } } col++; } row++; } }

 

 

 由于技术有限,现在打的马赛克只能是规则六边形。希望牛人给些指点,如何将晶格变成不规则的

你可能感兴趣的:(C++,c,娱乐,Class,DST,2010)