代码,有参考别人的代码

// 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. MFC误报内存泄露的修复

    在debug状态退出程序的时候,VS会在输出窗口列出可能的内存泄露的地方. MFC中使用DEBUG_NEW能够更方便的定位泄露的地点.但假如MFC的dll释放""过早"& ...

  2. UILabel 调整行间距

    /* 调整行间距 */ + (void)adjustLineSpacingOfLabel:(UILabel *)label to:(CGFloat)lineSpacing { NSString *te ...

  3. Java web文件上传下载

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52048666 作者:朱培 ID:sdksdk0 邮 ...

  4. 使用spark ml pipeline进行机器学习

    一.关于spark ml pipeline与机器学习 一个典型的机器学习构建包含若干个过程 1.源数据ETL 2.数据预处理 3.特征选取 4.模型训练与验证 以上四个步骤可以抽象为一个包括多个步骤的 ...

  5. Swift中switch强大的模式匹配

    不少人觉得Swift中switch语句和C或C++,乃至ObjC中的差不多,此言大谬! 让本猫带领大家看一下Swift中switch语句模式匹配的威力. 所谓模式匹配就是利用一定模式(比如couple ...

  6. LibVLC自定义插件目录,获取FPS方法

    一.自定义插件目录 在Windows平台,使用LibVLC,只需要在VLC官网的nightly builds下载最新的win32 debug或win64 debug包, 解压缩之后,会有libvlc. ...

  7. JQuery插件使用之Validation 快速完成表单验证的几种方式

    JQuery的Validation插件可以到http://plugins.jquery.com/上去下载.今天来分享一下,关于这个插件的使用. 简易使用 这第一种方式可谓是傻瓜式的使用,我们只需要按照 ...

  8. Asp.net 在刷新或提交页面后保持滚动条的位置

    网页内容在较长时,每次回传刷新页面或提交网页时都会定位到最顶端,非常不利于用户交互. 将Page.MaintainScrollPositionOnPostBack属性值设置为true即可实现刷新后保持 ...

  9. Android必知必会-带列表的地图POI周边搜索

    如果移动端访问不佳,请尝试–> Github版 2016-08-22 更新 注意:在 Activity 代码中的onPoiSearched(PoiResult result, int rCode ...

  10. introduction of velocity

    一.velocity 简介 基于java 的模板引擎,apache 旗下的开源软件项目. 目的在于隔离 表示层和业务逻辑层,当然现在做的不仅仅是这些. 二.应用场景 web 应用程序:创建html页面 ...