代码,有参考别人的代码

// haha_mirror.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream> #include "cv.h"
#include "highgui.h"
#include "math.h"
#include "opencv2/core/core.hpp" #pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_highgui2410d.lib")
#pragma comment(lib,"opencv_imgproc2410d.lib") #define DOWNRESIZE 0 // 缩小
#define UPRESIZE 1 // 放大
#define HORAO 2 // 水平外凹
#define HORTU 3 // 水平外凸
#define LADDER 4 // 梯形变形
#define TRIANGLE 5 // 三角形变形
#define SSHAPE 6 // S形变形
#define WAVESHAPE 7 // 波浪形变形
#define Concentrated 8 //集中形变形
#define Scattered 9 // 散开形变形 #define RANGE 100 // 水平外凹或外凸的幅度
#define PI 3.1415926 using namespace std;
using namespace cv; void MaxFrame(IplImage* frame)
{
uchar* old_data = (uchar*)frame->imageData;
uchar* new_data = new uchar[frame->widthStep * frame->height]; int center_X = frame->width / 2;
int center_Y = frame->height / 2;
int radius = 400;
int newX = 0;
int newY = 0; int real_radius = (int)(radius / 2.0);
for (int i = 0; i < frame->width; i++)
{
for (int j = 0; j < frame->height; j++)
{
int tX = i - center_X;
int tY = j - center_Y; int distance = (int)(tX * tX + tY * tY);
if (distance < radius * radius)
{
newX = (int)((float)(tX) / 2.0);
newY = (int)((float)(tY) / 2.0); newX = (int) (newX * (sqrt((double)distance) / real_radius));
newX = (int) (newX * (sqrt((double)distance) / real_radius)); newX = newX + center_X;
newY = newY + center_Y; new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * newY + newX * 3];
new_data[frame->widthStep * j + i * 3 + 1] =old_data[frame->widthStep * newY + newX * 3 + 1];
new_data[frame->widthStep * j + i * 3 + 2] =old_data[frame->widthStep * newY + newX * 3 + 2];
}
else
{
new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * j + i * 3];
new_data[frame->widthStep * j + i * 3 + 1] = old_data[frame->widthStep * j + i * 3 + 1];
new_data[frame->widthStep * j + i * 3 + 2] = old_data[frame->widthStep * j + i * 3 + 2];
}
}
}
memcpy(old_data, new_data, sizeof(uchar) * frame->widthStep * frame->height);
delete[] new_data;
} void MinFrame(IplImage* frame)
{
uchar* old_data = (uchar*)frame->imageData;
uchar* new_data = new uchar[frame->widthStep * frame->height]; int center_X = frame->width / 2;
int center_Y = frame->height / 2; int radius = 0;
double theta = 0;
int newX = 0;
int newY = 0; for (int i = 0; i < frame->width; i++)
{
for (int j = 0; j < frame->height; j++)
{
int tX = i - center_X;
int tY = j - center_Y; theta = atan2((double)tY, (double)tX);
radius = (int)sqrt((double)(tX * tX) + (double) (tY * tY));
int newR = (int)(sqrt((double)radius) * 12);
newX = center_X + (int)(newR * cos(theta));
newY = center_Y + (int)(newR * sin(theta)); if (!(newX > 0 && newX < frame->width))
{
newX = 0;
}
if (!(newY > 0 && newY < frame->height))
{
newY = 0;
} new_data[frame->widthStep * j + i * 3] = old_data[frame->widthStep * newY + newX * 3];
new_data[frame->widthStep * j + i * 3 + 1] =old_data[frame->widthStep * newY + newX * 3 + 1];
new_data[frame->widthStep * j + i * 3 + 2] =old_data[frame->widthStep * newY + newX * 3 + 2];
}
}
memcpy(old_data, new_data, sizeof(uchar) * frame->widthStep * frame->height);
delete[] new_data;
} // 哈哈镜制作
int main( int argc, char** argv )
{
IplImage* pImg; //声明IplImage指针
IplImage* pImg1; //声明IplImage指针
int i,j;
int method = 0;
CvSize size;
double tmp; method = 8;
//method = HORAO; //载入图像
pImg = cvLoadImage( "lena.jpg", 1);
cvNamedWindow( "Image", 1 );//创建窗口
cvShowImage( "Image", pImg );//显示图像
printf("imageSize: %d height: %d, width: %d, nChannels: %d\n", pImg->imageSize, pImg->height, pImg->width, pImg->nChannels); //MaxFrame(pImg);
//MinFrame(pImg); switch(method)
{
// 图像缩小
case DOWNRESIZE:
size = cvGetSize(pImg);
size.width = (size.width>>3)<<2; // 在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。
size.height = size.height>>1;
pImg1 = cvCreateImage( size, IPL_DEPTH_8U, 1);
printf("imageSize: %d height: %d, width: %d, nChannels: %d\n", pImg1->imageSize, pImg1->height, pImg1->width, pImg1->nChannels);
for(i=0;i<pImg1->height;i++)
for(j=0;j<pImg1->width;j++)
{
pImg1->imageData[i*pImg1->width+j] = pImg->imageData[i*2*pImg->width+j*2];
}
break;
// 图像放大
case UPRESIZE:
/* 添加代码 */
break;
// 水平外凹
case HORAO:
pImg1 = cvCreateImage( cvGetSize(pImg), IPL_DEPTH_8U, 1);
printf("imageSize: %d height: %d, width: %d, nChannels: %d\n", pImg1->imageSize, pImg1->height, pImg1->width, pImg1->nChannels);
for(i=0;i<pImg1->height;i++)
{
tmp = RANGE*sin(i*PI/pImg1->height);
for(j=tmp;j<pImg1->width-tmp;j++)
{
pImg1->imageData[i*pImg1->width+j] = pImg->imageData[i*pImg->width+(int)((j-tmp)*(pImg->width)/(pImg->width-2*tmp))];
}
}
break;
// 水平外凸
case HORTU:
/* 添加代码 */
break;
// 梯形变形
case LADDER:
/* 添加代码 */
break;
// 三角形变形
case TRIANGLE:
/* 添加代码 */
break;
// S形变形
case SSHAPE:
/* 添加代码 */
break;
// 波浪形变形
case WAVESHAPE:
/* 添加代码 */
break;
case Concentrated:
MaxFrame(pImg);
break;
case Scattered:
MinFrame(pImg);
break;
default:
printf("no method support\n");
break;
} // 显示结果
cvNamedWindow( "Image1", 1 );//创建窗口
cvShowImage( "Image1", pImg );//显示图像 cvWaitKey(0); //等待按键 //销毁窗口 释放内存
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
cvDestroyWindow( "Image1" );//销毁窗口
cvReleaseImage( &pImg1 ); //释放图像 return 0; }

实现效果:

未完待续。。应该还有其他的算法,我再找找

OpenCV 实现哈哈镜效果的更多相关文章

  1. OpenCV开发实战1——抖音哈哈镜效果

    前言 在抖音中,我们经常看到各种抖音玩家都喜欢使用哈哈镜效果.那么什么是哈哈镜呢? 在现实生活中,哈哈镜是指一种表面凹凸不平的镜子,可以反应出人像及物体的扭曲面貌.简单点来说就是拉伸人脸(物件),或者 ...

  2. Unity 3D用简单的Cube、Sphere实现镜面/哈哈镜效果,只需十几秒哦!

    Unity实现镜面和哈哈镜效果 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  3. Win8 Metro(C#)数字图像处理--2.61哈哈镜效果

    原文:Win8 Metro(C#)数字图像处理--2.61哈哈镜效果  [函数名称] 哈哈镜效果函数  WriteableBitmap DistortingMirrorProcess(Writea ...

  4. GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割

     One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...

  5. python+opencv+dlib瘦脸效果

    对实现人脸瘦脸简单功能的一个记录,大概流程如下: 1.使用dlib检测出人脸关键点 2.使用Interactive Image Warping 局部平移算法实现瘦脸 参考:https://blog.c ...

  6. OpenCV3入门(十四)图像特效—挤压、哈哈镜、扭曲

    一.图像挤压特效 1.原理 图像压效果本质的图像坐标的非线性变换,将图像向内挤压,挤压的过程产生压缩变形,从而形成的效果. 挤压效果的实现是通过极坐标的形式,设图像中心为O(x,y),某点距离中心O的 ...

  7. 在unity3d中使用opencv

    1.首先下载opencv2.4.10,解压缩后放在合适的地方,然后根据自己的电脑(32位或64位)选择X86或X64,我的是32位,将“opencv存放路径\build\x86\vc12\bin”加入 ...

  8. OpenCV基础篇之画图及RNG随机数对象

    程序及分析 /* * FileName : random_gen.c * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  9. python+OpenCV 特征点检测

    1.Harris角点检测 Harris角点检测算法是一个极为简单的角点检测算法,该算法在1988年就被发明了,算法的主要思想是如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点.基本原理是根据 ...

随机推荐

  1. java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20Foundation\Tomcat%205.0\webapp

    慢慢把以前遇到过的问题一点点发出来,以前做的笔记比较杂: java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20F ...

  2. Mac小技巧:快速查看指定应用程序的所有窗口

    我们知道在Mac中快速在系统所有程序中切换得快捷键为: cmd + tab 不过有时我们需要快速查看某一个程序的所有窗口,那又该如何呢? 以下方法在MacOS 10.12中测试成功! Mac默认该功能 ...

  3. Android 使用DownloadManager进行版本更新的完整方案

    在Android App都会有版本更新的功能,以前我们公司是用友盟SDK更新功能,自己服务器没有这样的功能.版本检测.Apk下载都是使用友盟.最近看到友盟的版本更新SDK文档:十月份更新功能将会停止服 ...

  4. activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)

    1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加 ...

  5. CCSpriteBatchNode中存放元素的一点理解

    该对象只能包含基于CCSprite的对象,并且该要求适用于一切子孙对象.即加入CCSpriteBatchNode的任何对象都必须是CCSprite或其子类. 比如CCSpriteBatchNode包含 ...

  6. Xcode7.3.1中SKAudioNode在Scene转换后无声的问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在新的Xcode中之前可以正常运行的SKAudioNode代码 ...

  7. Java基本语法-----java常量

    1常量的概述 常量是指在程序运行过程中其值不能改变的量. 2常量类型 Java中常量的分类: 整数常量 : 所有整数 小数常量 : 所有小数 布尔常量 : 只有true和false 字符常量 :使用' ...

  8. JDOM生成、解析XML实例

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  9. Hive-ORC文件存储格式

    ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...

  10. iOS开发之Xcode常用调试(Debug)技巧总结

    一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是采用NSLog方法.但是NSLog效率低下,具体原因可以看这篇博 ...