2018-06-13 13:02:52 ZUP779 阅读数 2111
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20005 人正在学习 去看看 夏曹俊

运动模糊原理
运动模糊产生:假设图像f(x,y)进行平面运动,x0(t)和y0(t)分别是在x和y方向上随时间变化的量。则有表达式如下,g(x,y)为转换后该点的灰度值,f(x,y)为原图中对应点的灰度值。
计算后的g(x,y)值将大于255,因此这里采用除T的方式将值映射到0~255的范围内。

这里写图片描述

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
/*
1.  使用C++实现运动模糊的效果
(假设图像f(x,y)进行平面运动,x0(t)和y0(t)是X和Y方向上随时间变化的分量,
任意点的曝光总数是通过对时间间隔内瞬时曝光量的积分得到的)
*/

//积分函数 
//图 点x坐标 点y坐标 运动方向上的变化参数 积分范围(0~T) 积分delta
double fun(Mat srcImg,double x,double y,double temp, double T,double s){
    double result = 0;

    double delta = T * (s );

    //delta:用模拟法求积分时每小块delta的宽度
    for (double t = 0; t < T; t+=delta)
    {
        double tx,ty;
        tx = x-t*temp;
        ty = y-t*temp;
        if(tx < 0)
            tx = 0;
        if(ty < 0)
            ty = 0;
        result += srcImg.at<double>(tx,ty) * delta;

        //cout<<result<<endl;
        //system("PAUSE");
    }
    return result/T;
}

//src图 dest图 运动方向上的变化参数 积分范围(0~T) 积分delta
void motionBlur(Mat srcImg, Mat &destImg, double temp,double T, double s)
{
    int width = srcImg.cols;
    int height = srcImg.rows;
    //double tempX, tempY;
    double sumValue;

    destImg = Mat::zeros(height, width, CV_64FC1);
    srcImg.convertTo(srcImg, CV_64FC1);

    for (int i=0; i<height; i++)
    {
        for (int j=0; j<width; j++)
        {
            sumValue = fun(srcImg,i,j,temp,T,s);//求该点积分 
            //cout<<sumValue<<endl;
            //system("PAUSE");
            sumValue = sumValue > 255 ? 255 : sumValue;//避免溢出 
            destImg.at<double>(i, j) = (double)sumValue;
        }
    }
    destImg.convertTo(destImg, CV_8UC1);
}

int main()
{
    Mat img = imread("C:\\test.jpg");
    Mat result,grayImage;
    cvtColor(img, grayImage, CV_BGR2GRAY);
    motionBlur(grayImage, result,50 ,15, 0.1);
    imshow("gray", grayImage);
    imshow("motionBlur Image", result);
    waitKey();
    return 0;
}
2018-10-28 23:02:40 Aidam_Bo 阅读数 607
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20005 人正在学习 去看看 夏曹俊


 

//添加椒盐噪声
void salt(Mat& src,int number)
{
    for (int i = 0; i < number; i++)
    {
        int r = static_cast<int>(rng.uniform(0, src.rows));
        int c = static_cast<int>(rng.uniform(0, src.cols));
        int k = (static_cast<int>(rng.uniform(0, 1000))&1);
        if(k==1)
            src.at<uchar>(r, c) = 255;
        else
            src.at<uchar>(r, c) = 0;
    }
    return;
}
/*
* @ drt :高斯方差
* @ Medium :高斯均值
*/
int Get_Gauss(int Medium, int drt)
{
    //产生高斯样本,以U为均值,D为均方差
    double sum = 0;
    for (int i = 0; i<12; i++) 
        sum += rand() / 32767.00;
    //计算机中rand()函数为-32767~+32767(2^15-1)
    //故sum+为0~1之间的均匀随机变量
    return int(Medium + drt*(sum - 6));
    //产生均值为U,标准差为D的高斯分布的样本,并返回
}
/*
* variance :高斯噪声的方差
*/


 

//添加高斯噪声
void ImgAddGaussNoise1( uchar * dstImgbuff, int srcwith, int srcheigh, int chanels)
{
    assert( srcwith > 0 && srcheigh > 0);
    int bytecount = srcwith * srcheigh * chanels;
 
    for (size_t i = 0; i < bytecount; i++)
    {
        int  iTemp = dstImgbuff[i] + Get_Gauss(0, 20);
        iTemp = iTemp > 255 ? 255 : iTemp;
        iTemp = iTemp < 0 ? 0 : iTemp;
        dstImgbuff[i] = iTemp;
    }
}


 

//均值求取
void Meanvalue(Mat* src, int indexrows, int indexcols, float* meanv, int ker)
{
    int lo = (ker - 1) / 2;
    float total = 0;
    for (int i = indexrows - lo; i <= indexrows + lo; i++)
    {
        for (int j = indexcols - lo; j <= indexcols + lo; j++)
        {
            total += src->at<uchar>(i, j);
        }
    }
    *meanv = total / (ker * ker);
    return;
}
//中值求取
void Media(Mat* src, int indexrows, int indexcols, int* meanv, int ker)
{
    int lo = (ker - 1) / 2;
    vector<int>moreo;
    for (int i = indexrows - lo; i <= indexrows + lo; i++)
    {
        for (int j = indexcols - lo; j <= indexcols + lo; j++)
        {
            moreo.push_back(src->at<uchar>(i, j));
        }
    }
    sort(moreo.begin(), moreo.end());
    *meanv = moreo.at(ker * ker / 2);
    return;
}


 

//局部方差求取
void Vvalue(Mat* src, int indexrows, int indexcols, int* vall, int ker, float mean)
{
    int lo = (ker - 1) / 2;
    float total = 0;
    for (int i = indexrows - lo; i <= indexrows + lo; i++)
    {
        for (int j = indexcols - lo; j <= indexcols + lo; j++)
        {
            total += pow((src->at<uchar>(i, j) - mean), 2);
        }
    }
    *vall = static_cast<int>(total);
    return;
}

 

//像素方差
void Variance(Mat& src, vector<test>& hierachy, int ker)
{
    int row = src.rows;
    int col = src.cols;
    int lo = (ker - 1) / 2;
    for (int ir = lo; ir < row - lo; ir++)
    {
        for (int jc = lo; jc < col - lo; jc++)
        {
            float means;
            int var;
            //计算均值
            Meanvalue(&src, ir, jc, &means, ker);
            Vvalue(&src, ir, jc, &var, ker, means);
            test temp;
            temp.menval = var;
            temp.x = ir;
            temp.y = jc;
            hierachy.push_back(temp);
        }
    }
    return;
}

 

//STL排序方式
bool SortByM1(const test &v1, const test &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致  
{
    return v1.menval < v2.menval;//升序排列  
}

 

//SSIM 结构相似比
Scalar getMSSIM(const Mat& i1, const Mat& i2)
{
    const double C1 = 6.5025, C2 = 58.5225;
    /***************************** INITS **********************************/
    int d = CV_32F;
 
    Mat I1, I2;
    i1.convertTo(I1, d);           // cannot calculate on one byte large values
    i2.convertTo(I2, d);
 
    int num = I1.channels();
    //cv::imshow("123", I1);
    //cv::waitKey();
 
    Mat I2_2 = I2.mul(I2);        // I2^2
    Mat I1_2 = I1.mul(I1);        // I1^2
    Mat I1_I2 = I1.mul(I2);        // I1 * I2
 
                                   /*************************** END INITS **********************************/
 
    Mat mu1, mu2;   // PRELIMINARY COMPUTING
    GaussianBlur(I1, mu1, Size(11, 11), 1.5);
    GaussianBlur(I2, mu2, Size(11, 11), 1.5);
 
    Mat mu1_2 = mu1.mul(mu1);
    Mat mu2_2 = mu2.mul(mu2);
    Mat mu1_mu2 = mu1.mul(mu2);
 
    Mat sigma1_2, sigma2_2, sigma12;
 
    GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
    sigma1_2 -= mu1_2;
 
    GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
    sigma2_2 -= mu2_2;
 
    GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
    sigma12 -= mu1_mu2;
 
    ///////////////////////////////// FORMULA ////////////////////////////////
    Mat t1, t2, t3;
 
    t1 = 2 * mu1_mu2 + C1;
    t2 = 2 * sigma12 + C2;
    t3 = t1.mul(t2);              // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
 
    t1 = mu1_2 + mu2_2 + C1;
    t2 = sigma1_2 + sigma2_2 + C2;
    t1 = t1.mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
 
    Mat ssim_map;
    divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;
 
    Scalar mssim = mean(ssim_map); // mssim = average of ssim map
    return mssim;
}
//功能:局部均值求取 局部方差求取
/* zc 2018/07/08
parameters:
Mat*         src;         //待处理的图像
float*       meanv;       //保存局部均值
float*       dev;         //保存局部方差
int          indexrows;   //要求局部所在行
int          indexcols;   //要求局部所在列
int          ker;         //窗口大小系数
*/
void Meanvalue(Mat* src, float* meanv, float* dev, int indexrows, int indexcols,  int ker)
{
    int lo = (ker - 1) / 2;
    float total = 0;
    float total2 = 0;
    for (int i = indexrows - lo; i <= indexrows + lo; i++)
    {
        for (int j = indexcols - lo; j <= indexcols + lo; j++)
        {
            float temp = static_cast<float>(src->at<uchar>(i, j));
            total += temp;
            total2 += temp*temp;
        }
    }
    int size = ker * ker;
    *meanv = total / size;                                      //均值
    *dev = (total2 - (total*total) / size) / size;              //方差
    return;
}



 
 

2012-11-04 20:09:21 gingerredjade 阅读数 4839
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20005 人正在学习 去看看 夏曹俊
Visual C++(VC/MFC)学习电子书及开发工具下载请看这里

注意:本帖包含C++和C语言的学习资料,C语言部分请向下看!

C++编程语言学习百宝箱(C++ Programming Language):

C++ How to Program, 8/E (C++大学教程 第8版) 英文版PDF下载

C++大学教程(第五版)中文版高清PDF下载

C++大学教程 第五版 (C++ How to Program, 5/e) 英文版

C++程序设计语言(特别版) 中文版

C++程序设计原理与实践 (中文高清版) | Programming: Principles and Practice Using C++ (英文原版)

The C++ Programming Language, 3rd Edition

C++ Primer 第四版 中文版

C++ Primer 第四版 中英文对照文字版

C++ Primer 第三版 中文版

C++ Cookbook 中文版 高清PDF下载 | O'Reilly C++ Cookbook

C++Primer Plus(第五版)中文版+习题解答+代码 | 英文原版

C++程序设计教程 第二版 钱能

易学C++ (Easy C++) 中文PDF文字版 附习题答案及书中源码

现代C++程序设计

C++ 参考大全 (第四版)

C++大学教程 中文chm

Effective C++ 中文版

Essential C++ 中文版+英文版 侯捷译

Exceptional C++ Style 中文版

C++编程思想(第2版)第1卷:标准C++导引

C++编程思想(第2版)第2卷:实用编程技术

C++入门经典(第三版) 中文PDF版+详细书签

Google C++编程风格指南

C++设计新思维(泛型编程与设计模式之应用)

C++语言的设计和演化

C++代码设计与重用

C++编程艺术

C++编程金典(第3版) 清华大学出版

C++编程规范:101条规则、准则与最佳实践

C++编程惯用法 高级程序员常用方法和技巧

疑惑C++

实用C++编程大全

C++程序设计与导论(第二版)

C和C++代码精粹

C++沉思录

C++必知必会

C++程序调试实用手册

C++面向对象多线程编程

高质量C++编程指南

深度探索c++对象模型 侯捷译

设计模式:可复用面向对象软件的基础 中文高清PDF版

C++精髓 软件工程方法

C++技术参考手册

C++游戏编程

C++高级编程

C++编程:数据结构与程序设计方法

数据结构C++语言描述 应用标准摸板库STL(第2版)

现代程序设计——C++与数据结构面向对象的方法与实现

C++高级参考手册

大规模C++程序设计

C++语言的设计和演化

C++标准程序库(前6章)

C++ Templates全览 中文版

C++模板元编程 中文PDF下载 (C++ Template Metaprogramming)

标准C++库函数参考

The Annotated C++ Reference Manual

C++多范型设计

COM实例编程

C++ STL程序员开发指南 PDF下载

C++ STL开发技术导引

STL源码剖析

泛型编程与STL

Effective STL 中文版

C++ STL程序员开发指南

C++模板 技术大全

C++语言的设计和演化 中文PDF版

数据结构各种算法实现(C++模板)

数据结构、算法与应用:C++语言描述

Absolute C++, 4th Edition

Sams C++ Unleashed

Effective C++, 3rd Edtition

O'Reilly C++ In a Nutshell

Exceptional C++ Style

More Exceptional C++

C++ Coding Standards

Inside the C++ Object Model

More Exceptional C++

Exceptional C++

Cross-Platform Development in C++

Practical C++ Programming

C++ GUI Qt 4编程(第二版)中文高清PDF版

C++ GUI Programming with Qt 4 (英文原版)

C++ Coding Standards 101 Rules Guidelines

C++ Template Metaprogramming

C++ Standard Library - A Tutorial and Reference

Professional Multicore Programming

Accelerated C++ - Practical Programming by Example

2005年度最经典C++教程8本打包下载



C编程语言学习百宝箱(C Programming Language):

C语言上机南开100题 (2006年终结修订word版 + txt分类版)

C语言程序设计:现代方法(第2版)中文版

C语言程序设计:现代方法 中文版

C程序设计(第四版)谭浩强 高清PDF下载

C程序设计(第四版)学习辅导 高清PDF下载

C程序设计语言(第2版·新版) 中文版PDF下载

C程序设计语言(第2版·新版) 文字版+书签 | C程序设计语言(第2版·新版) 习题解答

C程序设计 (第三版) 谭浩强

谭浩强 C语言程序设计 教程全书 Word版

C大学教程(第五版)中文版PDF下载

C Primer Plus(第五版)中文版

C语言入门经典(第4版)

北京大学 C语言程序设计学习大全 Word版 全1045页

C语言程序设计教程——基于Visual C++6.0环境

你必须知道的495个C语言问题 (C Programming FAQs)

C语言实例解析精粹

C专家编程

C和指针

C陷阱与缺陷

ANSI C语言规范

C语言编程 第三版

计算机图形学 C语言版

经典C程序100例

GCC 权威指南 第二版

O'Reilly C Pocket Reference

The C Programming Language

The C Programming Language Special Edition

The Standard C Library (Djvu格式)

Practical C Programming

C Primer Plus, 5th Edition

C Pocket Reference

C Traps and Pitfalls

Physics for Games Programmers


C/C++名师视频大汇总:

C语言程序设计 视频教程 吉林大学 康辉 48讲

石油大学 C语言程序设计视频教程 曾怡主讲 全33讲

吉林大学C语言视频教程 全51集 CSF格式

C语言基础视频教程 全14讲 完整上架

C语言程序设计视频教程 曾怡教授讲解 全28讲完整版下载

C++语言视频教程 全51讲

C++程序设计视频教程 东南大学何洁月主讲 全80讲

中山大学黎培兴 C++语言视频教程 全51讲完整版 精品推荐

数据结构 C语言版 视频教程 全52讲 完整版

孙鑫C++视频教程 rmvb格式 全20CD完整版 精品分享

C++视频教程 边用边学Visual C++ 6 (ASF格式)

VC++面向对象与可视化程序设计 视频教程

编程经典 C++ Builder视频教程 全26讲avi格式下载


另外,网络最强CASE工具 + 经典UML学习电子资下载汇总,软件设计与开发人员必备
2016-05-05 16:51:40 wenhao_ir 阅读数 451
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20005 人正在学习 去看看 夏曹俊

这里要说明下,由于自己将来主要是在嵌入式设备上实现图像处理算法,所以当既有C的写法又有C++的写法时,优先选取C的写法哈!

1 堆内存申请二维数组

申请256*256的double数组

int row_malloc, column_malloc;
double **arr;
row_malloc=256;
column_malloc=256;
arr = (double **)malloc(sizeof(double *) * row_malloc); // 分配所有行的首地址
for (i = 0; i < row_malloc; i ++)  // 按行分配每一列
      arr[i] = (double *)malloc(sizeof(double) * column_malloc);
//这里是中间的程序

 free(arr);//记着释放,使得程序运行时能尽量少用内存


2018-09-20 18:22:00 u013066730 阅读数 1142
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    20005 人正在学习 去看看 夏曹俊
没有更多推荐了,返回首页