代码,有参考别人的代码

// 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. 关于在页面中针对不同版本的IE浏览器实现不同的JS或者CSS样式

    一般会用到<!--[if IE]>这里是正常的html代码<![endif]--> 条件注释只能在windows Internet Explorer(以下简称IE)下使用,因此 ...

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

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

  3. Scikit-learn:模型评估Model evaluation

    http://blog.csdn.net/pipisorry/article/details/52250760 模型评估Model evaluation: quantifying the qualit ...

  4. 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

    新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene- ...

  5. Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架

    CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...

  6. FORM执行查询的各种方法

     一.FORM调用FORM后执行查询 1.打开 APPSTAND.fmb,把 Object Groups 下的 QUERY_FIND 对象组拖动到自己的 form 中的 Object Groups ...

  7. 如何查看App provision profile文件中的钥匙链访问组名称

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们因为某些原因希望安全的在多个App中共享一些信息,我们可以 ...

  8. 如何使用分布是缓存Hazelcast

    使用Hazelcast 1.在pom.xml中配置对Hazelcast的依赖 <dependencies> <dependency> <groupId>com.ha ...

  9. 高通msm8994性能及温度监测脚本

    [plain] view plain copystartTime=$(date +%Y-%m-%d-%H-%M-%S)  pathName="/data/cpu_logs"  fi ...

  10. [Python]程序性能分析

    有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考A guide to analyzing Python performance,也可以说是翻译. 指标 运行时间 时间瓶颈 内存使用 ...