opencv 实现图像倒影(渐变)效果【源码】

简介: opencv 实现图像倒影(渐变)效果【源码】
#include <opencv2/opencv.hpp> 
using namespace cv;  
using namespace std; 
#define RATIO 0.25
#define WEIGHT 2
#define DELTA 20
#define  ALPHA 0.15
#define  BETA 0.85
int _tmain(int argc, _TCHAR* argv[])
{
  // 准备源图像
  IplImage* src = cvLoadImage("..\\image.jpg");
  int width = src->width;
  int height = src->height;
  //cvSetImageROI(src, cvRect(0, (1-RATIO)*height, width, height));
  int mir_w = width;
  int mir_h = RATIO*height;
  IplImage* mir = cvCreateImage(cvSize(width, RATIO*height) ,src->depth, src->nChannels);
  //cvCopy(src, mir);// 拷贝有bug
  //cvResetImageROI(src);
  // 从源图像拷贝1/4图像作为镜像图像
  for (int i=0; i<width; i++)
  {
    for (int j=(1-RATIO)*height; j<height; j++)
    {
      uchar* pSrc = &CV_IMAGE_ELEM(src, uchar, j, i*3);
      uchar* pDst = &CV_IMAGE_ELEM(mir, uchar, (int)(j-(1-RATIO)*height), i*3);
      pDst[0] = pSrc[0];  //B
      pDst[1] = pSrc[1];  //G
      pDst[2] = pSrc[2];  //R
    }
  }
  cvFlip(mir, NULL, 0);// 0:上下镜像;1:左右镜像
  // 准备最终结果图像
  CvSize dstSize;
  dstSize.width = width;
  dstSize.height = height + mir_h;
  IplImage* dst = cvCreateImage(dstSize, src->depth, src->nChannels);
  cvZero(dst);
  // 载入源图像到结果图像中
  cvSetImageROI(dst, cvRect(0, 0, width, height));
  cvCopy(src, dst);
  cvResetImageROI(dst);
  // 准备镜像图像
  IplImage* mask = cvCreateImage(cvSize(mir_w, mir_h), mir->depth, mir->nChannels);
  CvScalar a = CV_RGB(255, 255, 255);
  CvScalar b = CV_RGB(0, 0, 0);
  cvSet(mask, a);
  CvPoint origin = cvPoint(mir_w/2, 0);       // 光源设在镜像图像上方
  //CvPoint center = cvPoint(mir_w/2, mir_h/2);
  float distance = (mir_w-1 - origin.x)*
    (mir_w-1 - origin.x)+             // 光源与图像右下角的距离
    (mir_h-1 - origin.y)*
    (mir_h-1 - origin.y);
  distance = sqrt(distance);
  //double weightB = (b.val[0] - a.val[0])/distance;  // 分别计算BGR三个通道的权重
  //double weightG = (b.val[1] - a.val[1])/distance;
  //double weightR = (b.val[2] - a.val[2])/distance;
  double weight = (b.val[0] - a.val[0])/distance; // 计算BGR三个通道的权重 -1.72
  for ( int i=0; i<mask->width; i++)
  {
    for (int j=0; j<mask->height; j++)
    {
      float dist = WEIGHT*(j-origin.y)*(j-origin.y);
      dist = sqrt(dist);
      uchar* ptr = &CV_IMAGE_ELEM(mask, uchar, j, i*3);
      ptr[0] = cvRound(ptr[0] + weight*dist-DELTA); //B
      ptr[1] = cvRound(ptr[1] + weight*dist-DELTA); //G
      ptr[2] = cvRound(ptr[2] + weight*dist-DELTA); //R
    }
  }
  cvAddWeighted(mir,ALPHA , mask, BETA, 0, mir);
  // 载入镜像图像到结果图像中
  cvSetImageROI(dst, cvRect(0, height, mir_w, mir_h));
  cvCopy(mir, dst);
  cvResetImageROI(dst);
  cvNamedWindow( "test", 1);
  cvShowImage( "test", dst);
  cvWaitKey();
  // 释放资源
  cvDestroyWindow("test");
  cvReleaseImage(&src);
  cvReleaseImage(&dst);
  cvReleaseImage(&mask);
  cvReleaseImage(&mir);
  return 0;
}

运行结果如下:

image.png

参考:

http://blog.csdn.net/willyang519/article/details/8179976

http://blog.csdn.net/quarryman/article/details/6418188

目录
相关文章
|
1月前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
49 3
|
1月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
344 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
2月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
50 4
|
1月前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
68 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
1月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
147 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
28天前
|
Ubuntu 编译器 计算机视觉
Ubuntu系统编译OpenCV4.8源码
【10月更文挑战第17天】只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。
|
2月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
3月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
110 1
|
4月前
|
Ubuntu 编译器 计算机视觉
Ubuntu系统下编译OpenCV4.8源码
在Ubuntu上源码安装OpenCV 4.8分为三步:1) 下载源码包,使用`wget`命令;2) 安装依赖,如`g++`, `cmake`, `make`等;3) 创建编译目录,运行`cmake`配置,接着`make`编译,最后`sudo make install`安装。安装完成后,通过编写和运行一个简单的OpenCV C++程序来验证环境配置正确性。
135 10