随笔分类 -  OpenCV

摘要:前面提到了YV12转RGB的各种实现方法和优化方法,主要是CPU上的实现。本文主要介绍基于GPU的YV12转RGB的实现。1. 基于OpenGL的实现利用OpenGL shader实现将YV12转RGB,将Y、U、V分量数据作为纹理数据,并构造YUV转RGB的shader代码,最终纹理数据在shad... 阅读全文
posted @ 2014-05-07 16:12 一点心青 阅读(4783) 评论(1) 推荐(1) 编辑
摘要:YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式。因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式。RGB与YUV的变换公式如下: YUV(256 级别) 可以从8位 RGB 直接计算:Y = 0.299 R + 0.587 G + 0.114... 阅读全文
posted @ 2014-05-07 15:53 一点心青 阅读(77497) 评论(5) 推荐(8) 编辑
摘要:由于相机正面白摄物体时,相机的光轴方向可能发生变化,带来扭曲。而SIFT算法虽具有完全的尺度不变性,但不具有完全的仿射不变性,对拍摄角度发生大角度空间变化的图像特征提取有一定的局限性。ASift通过模拟经度与纬度实现完全的仿射不变,然后用SIFT算法把模拟图像进行比较,最后实现特征匹配。ASIFT算法的具体步骤如下:1.选取采样参数,模拟不同经度与纬度的图像。2.计算模拟图像的特征。3.结合所有的模拟图像的特征,进行特征匹配。注意:ASIFT提供的一种框架,其核心思想是模拟不同的经度与纬度的图像,具体模拟图像的特征提取和匹配,可选择SIFT、SURF等特征。ASIFT算法代码资源:htt... 阅读全文
posted @ 2014-03-04 11:37 一点心青 阅读(12147) 评论(1) 推荐(1) 编辑
摘要:一、利用OpenCV中提供的GPU模块 目前,OpenCV中已提供了许多GPU函数,直接使用OpenCV提供的GPU模块,可以完成大部分图像处理的加速操作。 基本使用方法,请参考:http://www.cnblogs.com/dwdxdy/p/3244508.html 该方法的优点是使用简单,利用GpuMat管理CPU与GPU之间的数据传输,而且不需要关注内核函数调用参数的设置,使用过程中,只需要关注处理的逻辑操作。 缺点是受限于OpenCV库的发展和更新,当需要完成一些自定义的操作时(OpenCV中没有提供相应的库),难以满足应用的需求,需要自己实现自定义操作的并行实现。此外,针对一... 阅读全文
posted @ 2014-01-21 17:44 一点心青 阅读(31878) 评论(20) 推荐(1) 编辑
摘要:一、OpenCV中的硬编码OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下。 1 int main(int argc, const char* argv[]) 2 { 3 if (argc != 2) 4 { 5 std::cerr " > frame;28 if (frame.empty())29 {30 std::cout << "Stop" << std::endl;31 break;32 ... 阅读全文
posted @ 2013-08-08 22:56 一点心青 阅读(9924) 评论(0) 推荐(0) 编辑
摘要:问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈。解决思路:利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程。一、OpenCV中的硬解码OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下。 1 int main(int argc, const char* argv[]) 2 { 3 if (argc != 2) 4 return -1; 5 const std::string fname(arg... 阅读全文
posted @ 2013-08-07 22:18 一点心青 阅读(20372) 评论(10) 推荐(0) 编辑
摘要:CUDA基本使用方法在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下:1.主机代码执行;2.传输数据到GPU;3.确定grid,block大小;4.调用内核函数,GPU运行程序;5.传输结果到CPU;6.继续主机代码执行。下图是两个向量相加的简单示例程序和处理流图。注意的问题:cu,cpp文件的组织内核函数和其wrapper函数置于cu文件中。在cpp文件声明wrapper函数,并调用wrapper函数。wrapper函数的声明定义需加extern "C"。OpenCV中GPU模块的使用使用的步骤与CUDA的基本使用方法类似,只是Ope 阅读全文
posted @ 2013-08-07 21:22 一点心青 阅读(55416) 评论(8) 推荐(2) 编辑
摘要:问题描述:在测试目标跟踪算法时,需要选择不同区域作为目标,进行目标跟踪,测试目标跟踪的效果。解决思路:1.OpenCV中提供了鼠标交互控制,利用setMouseCallback()给固定的窗口设置鼠标回调函数。2.在鼠标回调函数中,选择感兴趣区域。代码实现如下,将感兴趣区域封装在MouseSelect类中,提供选择点和矩形框两种模式。 1 #pragma once 2 #ifndef __MOUSESELECT_H__ 3 #define __MOUSESELECT_H__ 4 5 #include 6 #include 7 8 #define MAX_OBJECTS 10 9 ... 阅读全文
posted @ 2013-08-07 19:58 一点心青 阅读(7673) 评论(0) 推荐(0) 编辑
摘要:问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域。算法思想:若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图,因而可以转换成图像匹配问题。图像匹配问题,可以融合两幅图像,得到全景图,但无法标识出在原图像的重叠区域。将两幅图像都理解为多边形,则其重叠区域的计算,相当于求多边形的交集。通过多边形求交,获取重叠区域的点集,然后利用单应矩阵还原在原始图像的点集信息,从而标识出重叠区域。算法步骤:1.图像匹配计算,获取单应矩阵。2.根据单应矩阵,计算图像2的顶点转换后的点集。3.由图像1的顶点集合和图像2的转换点集, 阅读全文
posted @ 2013-08-02 12:50 一点心青 阅读(19955) 评论(14) 推荐(3) 编辑
摘要:OpenCV1.0中错误处理与C语言标准函数库里的错误处理相似,设置全局错误标识,通过检查全局错误标识,来判断程序是否出现错误,并进行错误报告.在OpenCV1.0中,如果调用函数出现错误并不直接返回错误代码,而是用CV_ERROR宏调用cvError函数报错,并设置错误状态,然后调用标准的或者用户自定义的错误处理器.每个程序的线程都有一个全局变量,它包含了错误状(一个整数值).这个状态可以被cvGetErrStatus函数查询到.//保存错误所在的文件和行typedef struct{ const char* file; int line;}CvStackReco... 阅读全文
posted @ 2012-07-19 13:24 一点心青 阅读(7418) 评论(0) 推荐(0) 编辑
摘要:最近在学习,利用CUDA加速图像处理方面知识.下面主要介绍codeproject上的一个项目例子.利用cuda进行图像滤波处理.网址:http://www.codeproject.com/Articles/206036/Image-Filters-using-CPU-and-GPU其处理流程如下:其中,也可以从视频文件中读取数据,进行处理.主要类图如下所示:ISingleImageFilter是抽象类,提供接口,SingleImageFilter实现抽象类的基类,增加一些属性成员变量.利用虚函数实现多态,通过指向基类的指针调用不同子类的函数实现.思考点:1).其类体的设计,以及类之间的继承关系 阅读全文
posted @ 2012-06-08 10:45 一点心青 阅读(2066) 评论(0) 推荐(1) 编辑
摘要:问题描述:关键帧提取后,将会得一序列关键帧的帧号,然后需要把这些帧保存起来,以便于浏览和管理.通过opencv里的VideoCapture的函数set(CV_CAP_PROP_POS_FRAMES,nextFrameNumber),定位到具体的帧号,但最终读取的并不是对应帧的图像.问题出现的原因:Opencv底层是通过ffmpeg读取视频.其中定位主要用av_seek_frame()来定位frame的位置.int av_seek_frame(AVFormatContext *s,int stream_index,int64_t timestamp,int flags)其中最后一个参数有AVSE 阅读全文
posted @ 2012-06-04 15:08 一点心青 阅读(11236) 评论(1) 推荐(0) 编辑