搜档网
当前位置:搜档网 › OpenCV最基础的图像处理的例子

OpenCV最基础的图像处理的例子

OpenCV最基础的图像处理的例子
OpenCV最基础的图像处理的例子

?什么是OpenCV

?开源C/C++计算机视觉库.

?面向实时应用进行优化.

?跨操作系统/硬件/窗口管理器.

?通用图像/视频载入、存储和获取.

?由中、高层API构成.

?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口.

?特性:

?图像数据操作(分配,释放, 复制, 设定, 转换).

?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出).

?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD).

?各种动态数据结构(列表, 队列, 集, 树, 图).

?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔).

?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化).

?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配).

?动作分析(光流, 动作分割, 跟踪).

?对象辨识 (特征方法, 隐马可夫链模型HMM).

?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条).

?图像标识 (直线, 圆锥, 多边形, 文本绘图)

?OpenCV 模块:

?cv - OpenCV 主要函数.

?cvaux - 辅助(实验性) OpenCV 函数.

?cxcore - 数据结构与线性代数算法.

?highgui - GUI函数.

资料链接

?参考手册:

?/docs/index.htm

?网络资源:

?官方网页: https://www.sodocs.net/doc/2515999938.html,/technology/computing/opencv/?软件下载: https://www.sodocs.net/doc/2515999938.html,/projects/opencvlibrary/

?书籍:

?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006).

?视频处理例程(位于/samples/c/目录中):

?色彩跟踪: camshiftdemo

?点跟踪: lkdemo

?动作分割: motempl

?边缘检测: laplace

?图像处理例程(位于/samples/c/目录中):

?边缘检测: edge

?分割: pyramid_segmentation

?形态: morphology

?直方图: demhist

?距离转换: distrans

?椭圆拟合fitellipse

?OpenCV 命名约定

?函数命名:

cvActionTarget[Mod](...)

Action = 核心功能(例如设定set, 创建create)

Target = 操作目标 (例如轮廓contour, 多边形polygon)

[Mod] = 可选修饰词 (例如说明参数类型)

?矩阵数据类型:

CV_(S|U|F)C

S = 带符号整数

U = 无符号整数

F = 浮点数

例: CV_8UC1 表示一个8位无符号单通道矩阵,

CV_32FC2 表示一个32位浮点双通道矩阵.

?图像数据类型:

IPL_DEPTH_(S|U|F)

例: IPL_DEPTH_8U 表示一个8位无符号图像.

IPL_DEPTH_32F 表示一个32位浮点数图像.

?头文件:

#include

#include

#include

#include // 不必要 - 该头文件已在 cv.h 文件中包含编译命令

?Linux系统:

g++ hello-world.cpp -o hello-world \

-I /usr/local/include/opencv -L /usr/local/lib \

-lm -lcv -lhighgui -lcvaux

?Windows系统:

注意在项目属性中设好OpenCV头文件以及库文件的路径.

C程序实例

?//////////////////////////////////////////////////////////////////////// //

// hello-world.cpp

//

// 一个简单的OpenCV程序

// 它从一个文件中读取图像,将色彩值颠倒,并显示结果.

//

////////////////////////////////////////////////////////////////////////

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

IplImage* img = 0;

int height,width,step,channels;

uchar *data;

int i,j,k;

if(argc<2){

printf("Usage: main \n\7");

exit(0);

}

// 载入图像

img=cvLoadImage(argv[1]);

if(!img){

printf("Could not load image file: %s\n",argv[1]);

exit(0);

}

// 获取图像数据

height = img->height;

width = img->width;

step = img->widthStep;

channels = img->nChannels;

data = (uchar *)img->imageData;

printf("Processing a %dx%d image with %d channels\n",height,width,channels);

// 创建窗口

cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);

cvMoveWindow("mainWin", 100, 100);

// 反色图像

for(i=0;i

data[i*step+j*channels+k]=255-data[i*step+j*channels+k];

// 显示图像

cvShowImage("mainWin", img );

// wait for a key

cvWaitKey(0);

// release the image

cvReleaseImage(&img );

return 0;

}

?GUI命令

窗口管理

?创建并放置一个窗口:

cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);

cvMoveWindow("win1", 100, 100); // 以屏幕左上角为起点的偏移量?读入图像:

IplImage* img=0;

img=cvLoadImage(fileName);

if(!img) printf("Could not load image file: %s\n",fileName); ?显示图像:

cvShowImage("win1",img);

?可显示彩色或灰度的字节/浮点图像。彩色图像数据认定为BGR顺序.

?关闭窗口:

?cvDestroyWindow("win1");

?改变窗口尺寸:

cvResizeWindow("win1",100,100); // 新的宽/高值(象素点)

输入设备

?响应鼠标事件:

?定义鼠标handler:

void mouseHandler(int event, int x, int y, int flags, void* param) {

switch(event){

case CV_EVENT_LBUTTONDOWN:

if(flags & CV_EVENT_FLAG_CTRLKEY)

printf("Left button down with CTRL pressed\n");

break;

case CV_EVENT_LBUTTONUP:

printf("Left button up\n");

break;

}

}

// x,y: 针对左上角的像点坐标

// event: CV_EVENT_LBUTTONDOWN, CV_EVENT_RBUTTONDOWN,

CV_EVENT_MBUTTONDOWN,

// CV_EVENT_LBUTTONUP, CV_EVENT_RBUTTONUP,

CV_EVENT_MBUTTONUP,

// CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK,

CV_EVENT_MBUTTONDBLCLK,

// CV_EVENT_MOUSEMOVE:

// flags: CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY,

CV_EVENT_FLAG_ALTKEY,

// CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON, CV_EVENT_FLAG_MBUTTON

?注册handler:

mouseParam=5;

cvSetMouseCallback("win1",mouseHandler,&mouseParam);

?响应键盘事件:

?键盘没有事件handler.

?直接获取键盘操作:

int key;

key=cvWaitKey(10); // 输入等待10ms

?等待按键并获取键盘操作:

int key;

key=cvWaitKey(0); // 无限等待键盘输入

?键盘输入循环:

while(1){

key=cvWaitKey(10);

if(key==27) break;

switch(key){

case 'h':

...

break;

case 'i':

...

break;

}

}

?处理滚动条事件:

?定义滚动条handler:

void trackbarHandler(int pos)

{

printf("Trackbar position: %d\n",pos);

}

?注册handler:

int trackbarVal=25;

int maxVal=100;

cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);

?获取滚动条当前位置:

int pos = cvGetTrackbarPos("bar1","win1");

?设定滚动条位置:

cvSetTrackbarPos("bar1", "win1", 25);

OpenCV基础数据结构

图像数据结构

IPL 图像:

IplImage

|-- int nChannels; // 色彩通道数(1,2,3,4)

|-- int depth; // 象素色深:

| // IPL_DEPTH_8U, IPL_DEPTH_8S,

| // IPL_DEPTH_16U,IPL_DEPTH_16S,

| // IPL_DEPTH_32S,IPL_DEPTH_32F,

| // IPL_DEPTH_64F

|-- int width; // 图像宽度(象素点数)

|-- int height; // 图像高度(象素点数)

|-- char* imageData; // 指针指向成一列排列的图像数据

| // 注意色彩顺序为BGR

|-- int dataOrder; // 0 - 彩色通道交叉存取 BGRBGRBGR,

| // 1 - 彩色通道分隔存取 BBBGGGRRR

| // 函数cvCreateImage只能创建交叉存取的图像

|-- int origin; // 0 - 起点为左上角,

| // 1 - 起点为右下角(Windows位图bitmap格式)

|-- int widthStep; // 每行图像数据所占字节大小

|-- int imageSize; // 图像数据所占字节大小 = 高度*每行图像数据字节大小

|-- struct _IplROI *roi;// 图像ROI. 若不为NULL则表示需要处理的图像

| // 区域.

|-- char *imageDataOrigin; // 指针指向图像数据原点

| // (用来校准图像存储单元的重新分配) |

|-- int align; // 图像行校准: 4或8字节校准

| // OpenCV不采用它而使用widthStep

|-- char colorModel[4]; // 图像色彩模型 - 被OpenCV忽略

矩阵与向量

?矩阵:

?CvMat // 2维数组

|-- int type; // 元素类型(uchar,short,int,float,double)

|-- int step; // 一行所占字节长度

|-- int rows, cols; // 尺寸大小

|-- int height, width; // 备用尺寸参照

|-- union data;

|-- uchar* ptr; // 针对unsigned char矩阵的数据指针

|-- short* s; // 针对short矩阵的数据指针

|-- int* i; // 针对integer矩阵的数据指针

|-- float* fl; // 针对float矩阵的数据指针

|-- double* db; // 针对double矩阵的数据指针

CvMatND // N-维数组

|-- int type; // 元素类型(uchar,short,int,float,double)

|-- int dims; // 数组维数

|-- union data;

| |-- uchar* ptr; // 针对unsigned char矩阵的数据指针

| |-- short* s; // 针对short矩阵的数据指针

| |-- int* i; // 针对integer矩阵的数据指针

| |-- float* fl; // 针对float矩阵的数据指针

| |-- double* db; // 针对double矩阵的数据指针

|

|-- struct dim[]; // 每个维的信息

|-- size; // 该维内元素个数

|-- step; // 该维内元素之间偏移量

CvSparseMat // 稀疏N维数组

?通用数组:

CvArr* // 仅作为函数参数,说明函数接受多种类型的数组,例如: // IplImage*, CvMat* 或者 CvSeq*.

// 只需通过分析数组头部的前4字节便可确定数组类型

?标量:

CvScalar

|-- double val[4]; //4D向量

初始化函数:

?CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0);

?举例:

CvScalar s = cvScalar(20.0);

s.val[0]=10.0;

?注意:初始化函数与数据结构同名,只是首字母小写. 它不是C++的构造函数.

其他数据结构

?点:

CvPoint p = cvPoint(int x, int y);

CvPoint2D32f p = cvPoint2D32f(float x, float y);

CvPoint3D32f p = cvPoint3D32f(float x, float y, float z);

例如:

p.x=5.0;

p.y=5.0;

?长方形尺寸:

CvSize r = cvSize(int width, int height);

CvSize2D32f r = cvSize2D32f(float width, float height);

?带偏移量的长方形尺寸:

CvRect r = cvRect(int x, int y, int width, int height);

?图像处理

分配与释放图像空间

?分配图像空间:

IplImage* cvCreateImage(CvSize size, int depth, int channels);

size: cvSize(width,height);

depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,

IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F

channels: 1, 2, 3 or 4.

注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...

举例:

// 分配一个单通道字节图像

IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

// 分配一个三通道浮点图像

IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

?释放图像空间:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

cvReleaseImage(&img);

?复制图像:

IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

IplImage* img2;

img2=cvCloneImage(img1);

?设定/获取兴趣区域:

void cvSetImageROI(IplImage* image, CvRect rect);

void cvResetImageROI(IplImage* image);

vRect cvGetImageROI(const IplImage* image);

大部分OpenCV函数都支持ROI.

?设定/获取兴趣通道:

void cvSetImageCOI(IplImage* image, int coi); // 0=all

int cvGetImageCOI(const IplImage* image);

大部分OpenCV函数暂不支持COI.

读取存储图像

?从文件中载入图像:

IplImage* img=0;

img=cvLoadImage(fileName);

if(!img) printf("Could not load image file: %s\n",fileName);

Supported image formats: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIF

载入图像默认转为3通道彩色图像. 如果不是,则需加flag:

img=cvLoadImage(fileName,flag);

flag: >0 载入图像转为三通道彩色图像

=0 载入图像转为单通道灰度图像

<0 不转换载入图像(通道数与图像文件相同).

?图像存储为图像文件:

if(!cvSaveImage(outFileName,img)) printf("Could not

save: %s\n",outFileName);

输入文件格式由文件扩展名决定.

存取图像元素

?假设需要读取在i行j列像点的第k通道.其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].

?间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)

?对单通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

CvScalar s;

s=cvGet2D(img,i,j); // get the (i,j) pixel value

printf("intensity=%f\n",s.val[0]);

s.val[0]=111;

cvSet2D(img,i,j,s); // set the (i,j) pixel value

?对多通道浮点或字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

CvScalar s;

s=cvGet2D(img,i,j); // get the (i,j) pixel value

printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);

s.val[0]=111;

s.val[1]=111;

s.val[2]=111;

cvSet2D(img,i,j,s); // set the (i,j) pixel value

?直接存取: (效率高, 但容易出错)

?对单通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

((uchar *)(img->imageData + i*img->widthStep))[j]=111;

?对多通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

?对多通道浮点图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

?用指针直接存取: (在某些情况下简单高效)

?对单通道字节图像:

IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

int height = img->height;

int width = img->width;

int step = img->widthStep/sizeof(uchar);

uchar* data = (uchar *)img->imageData;

data[i*step+j] = 111;

?对多通道字节图像:

IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

int height = img->height;

int width = img->width;

int step = img->widthStep/sizeof(uchar);

int channels = img->nChannels;

uchar* data = (uchar *)img->imageData;

data[i*step+j*channels+k] = 111;

?对单通道浮点图像(假设用4字节调整):

IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

int height = img->height;

int width = img->width;

int step = img->widthStep/sizeof(float);

int channels = img->nChannels;

float * data = (float *)img->imageData;

data[i*step+j*channels+k] = 111;

?使用c++ wrapper 进行直接存取: (简单高效)

?对单/多通道字节图像,多通道浮点图像定义一个 c++ wrapper: template class Image

{

private:

IplImage* imgp;

public:

Image(IplImage* img=0) {imgp=img;}

~Image(){imgp=0;}

void operator=(IplImage* img) {imgp=img;}

inline T* operator[](const int rowIndx) {

return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));} };

typedef struct{

unsigned char b,g,r;

} RgbPixel;

typedef struct{

float b,g,r;

} RgbPixelFloat;

typedef Image RgbImage;

typedef Image RgbImageFloat;

typedef Image BwImage;

typedef Image BwImageFloat;

?单通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

BwImage imgA(img);

imgA[i][j] = 111;

?多通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

RgbImage imgA(img);

imgA[i][j].b = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

?多通道浮点图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

RgbImageFloat imgA(img);

imgA[i][j].b = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

图像转换

?转为灰度或彩色字节图像:

cvConvertImage(src, dst, flags=0);

src = float/byte grayscale/color image

dst = byte grayscale/color image

flags = CV_CVTIMG_FLIP (flip vertically)

CV_CVTIMG_SWAP_RB (swap the R and B channels)

?转换彩色图像为灰度图像:

使用OpenCV转换函数:

cvCvtColor(cimg,gimg,CV_BGR2GRAY); // cimg -> gimg

直接转换:

for(i=0;iheight;i++) for(j=0;jwidth;j++)

gimgA[i][j]= (uchar)(cimgA[i][j].b*0.114 +

cimgA[i][j].g*0.587 +

cimgA[i][j].r*0.299);

?颜色空间转换:

cvCvtColor(src,dst,code); // src -> dst

code = CV_2

/ = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS

e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab

绘图命令

?画长方体:

// 用宽度为1的红线在(100,100)与(200,200)之间画一长方体

cvRectangle(img, cvPoint(100,100), cvPoint(200,200),

cvScalar(255,0,0), 1);

?画圆:

// 在(100,100)处画一半径为20的圆,使用宽度为1的绿线

cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);

?画线段:

// 在(100,100)与(200,200)之间画绿色线段,宽度为1

cvLine(img, cvPoint(100,100), cvPoint(200,200), cvScalar(0,255,0),

1);

?画一组线段:

CvPoint curve1[]={10,10, 10,100, 100,100, 100,10};

CvPoint curve2[]={30,30, 30,130, 130,130, 130,30, 150,10};

CvPoint* curveArr[2]={curve1, curve2};

int nCurvePts[2]={4,5};

int nCurves=2;

int isCurveClosed=1;

int lineWidth=1;

cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0, 255,255),lineWidth);

?画内填充色的多边形:

cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));

?添加文本:

CvFont font;

double hScale=1.0;

double vScale=1.0;

int lineWidth=1;

cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC,

hScale,vScale,0,lineWidth);

cvPutText (img,"My comment",cvPoint(200,400), &font,

cvScalar(255,255,0));

Other possible fonts:

CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN,

CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX,

CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL,

CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX,

矩阵操作

分配释放矩阵空间

?综述:

?OpenCV有针对矩阵操作的C语言函数. 许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.

?OpenCV将向量作为1维矩阵处理.

?矩阵按行存储,每行有4字节的校整.

?分配矩阵空间:

CvMat* cvCreateMat(int rows, int cols, int type);

type: 矩阵元素类型. 格式为

CV_(S|U|F)C.

例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.

例程:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

?释放矩阵空间:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

cvReleaseMat(&M);

?复制矩阵:

CvMat* M1 = cvCreateMat(4,4,CV_32FC1);

CvMat* M2;

M2=cvCloneMat(M1);

?初始化矩阵:

double a[] = { 1, 2, 3, 4,

5, 6, 7, 8,

9, 10, 11, 12 };

CvMat Ma=cvMat(3, 4, CV_64FC1, a);

另一种方法:

CvMat Ma;

cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);

?初始化矩阵为单位阵:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

cvSetIdentity(M); // 这里似乎有问题,不成功

存取矩阵元素

?假设需要存取一个2维浮点矩阵的第(i,j)个元素.

?间接存取矩阵元素:

cvmSet(M,i,j,2.0); // Set M(i,j)

t = cvmGet(M,i,j); // Get M(i,j)

?直接存取,假设使用4-字节校正:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

int n = M->cols;

float *data = M->data.fl;

data[i*n+j] = 3.0;

?直接存取,校正字节任意:

int step = M->step/sizeof(float);

float *data = M->data.fl;

(data+i*step)[j] = 3.0;

?直接存取一个初始化的矩阵元素:

double a[16];

CvMat Ma = cvMat(3, 4, CV_64FC1, a);

a[i*4+j] = 2.0; // Ma(i,j)=2.0;

矩阵/向量操作

?矩阵-矩阵操作:

CvMat *Ma, *Mb, *Mc;

cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc

cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc

cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc

?按元素的矩阵操作:

CvMat *Ma, *Mb, *Mc;

cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc

cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc

cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc

?向量乘积:

double va[] = {1, 2, 3};

double vb[] = {0, 0, 1};

double vc[3];

CvMat Va=cvMat(3, 1, CV_64FC1, va);

CvMat Vb=cvMat(3, 1, CV_64FC1, vb);

CvMat Vc=cvMat(3, 1, CV_64FC1, vc);

double res=cvDotProduct(&Va,&Vb); // 点乘: Va . Vb -> res

cvCrossProduct(&Va, &Vb, &Vc); // 向量积: Va x Vb -> Vc

end{verbatim}

注意Va, Vb, Vc 在向量积中向量元素个数须相同.

?单矩阵操作:

CvMat *Ma, *Mb;

cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (不能对自身进行转置) CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]

double d = cvDet(Ma); // det(Ma) -> d

cvInvert(Ma, Mb); // inv(Ma) -> Mb

?非齐次线性系统求解:

CvMat* x = cvCreateMat(3,1,CV_32FC1);

CvMat* b = cvCreateMat(3,1,CV_32FC1);

cvSolve(&A, &b, &x); // solve (Ax=b) for x

?特征值分析(针对对称矩阵):

CvMat* A = cvCreateMat(3,3,CV_32FC1);

CvMat* E = cvCreateMat(3,3,CV_32FC1);

CvMat* l = cvCreateMat(3,1,CV_32FC1);

cvEigenVV(&A, &E, &l); // l = A的特征值 (降序排列)

// E = 对应的特征向量 (每行)

?奇异值分解SVD:

CvMat* A = cvCreateMat(3,3,CV_32FC1);

CvMat* U = cvCreateMat(3,3,CV_32FC1);

CvMat* D = cvCreateMat(3,3,CV_32FC1);

CvMat* V = cvCreateMat(3,3,CV_32FC1);

cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T

标号使得U 和V 返回时被转置(若没有转置标号,则有问题不成功!!!).

视频序列操作

从视频序列中抓取一帧

?OpenCV支持从摄像头或视频文件(AVI)中抓取图像.

?从摄像头获取初始化:

CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0

?从视频文件获取初始化:

CvCapture* capture = cvCaptureFromAVI("infile.avi");

?抓取帧:

IplImage* img = 0;

if(!cvGrabFrame(capture)){ // 抓取一帧

printf("Could not grab a frame\n\7");

exit(0);

}

img=cvRetrieveFrame(capture); // 恢复获取的帧图像

要从多个摄像头同时获取图像, 首先从每个摄像头抓取一帧. 在抓取动作都结束后再恢复帧图像.

?释放抓取源:

cvReleaseCapture(&capture);

注意由设备抓取的图像是由capture函数自动分配和释放的. 不要试图自己释放它.

获取/设定帧信息

?获取设备特性:

cvQueryFrame(capture); // this call is necessary to get correct // capture properties

int frameH = (int) cvGetCaptureProperty(capture,

CV_CAP_PROP_FRAME_HEIGHT);

int frameW = (int) cvGetCaptureProperty(capture,

CV_CAP_PROP_FRAME_WIDTH);

int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

int numFrames = (int) cvGetCaptureProperty(capture,

CV_CAP_PROP_FRAME_COUNT);

所有帧数似乎只与视频文件有关. 用摄像头时不对,奇怪!!!.

?获取帧信息:

float posMsec = cvGetCaptureProperty(capture,

CV_CAP_PROP_POS_MSEC);

int posFrames = (int) cvGetCaptureProperty(capture,

CV_CAP_PROP_POS_FRAMES);

float posRatio = cvGetCaptureProperty(capture,

CV_CAP_PROP_POS_AVI_RATIO);

获取所抓取帧在视频序列中的位置, 从首帧开始按[毫秒]算. 或者从首帧开始从0标号, 获取所抓取帧的标号. 或者取相对位置,首帧为0,末帧为1, 只对视频文件有效.

?设定所抓取的第一帧标号:

// 从视频文件相对位置0.9处开始抓取

cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO,

(double)0.9);

只对从视频文件抓取有效. 不过似乎也不成功!!!

存储视频文件

?初始化视频存储器:

CvVideoWriter *writer = 0;

int isColor = 1;

int fps = 25; // or 30

int frameW = 640; // 744 for firewire cameras

int frameH = 480; // 480 for firewire cameras

writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'), fps,cvSize(frameW,frameH),isColor);

其他有效编码:

CV_FOURCC('P','I','M','1') = MPEG-1 codec

CV_FOURCC('M','J','P','G') = motion-jpeg codec (does not work well) CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec

CV_FOURCC('U', '2', '6', '3') = H263 codec

CV_FOURCC('I', '2', '6', '3') = H263I codec

CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

若把视频编码设为-1则将打开一个编码选择窗口(windows系统下).

?存储视频文件:

IplImage* img = 0;

int nFrames = 50;

for(i=0;i

cvGrabFrame(capture); // 抓取帧

img=cvRetrieveFrame(capture); // 恢复图像

cvWriteFrame(writer,img); // 将帧添加入视频文件}

若想在抓取中查看抓取图像, 可在循环中加入下列代码:

cvShowImage("mainWin", img);

key=cvWaitKey(20); // wait 20 ms

若没有20[毫秒]延迟,将无法正确显示视频序列.

?释放视频存储器:

cvReleaseVideoWriter(&writer);

图像处理opencv代码

#include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于OpenCV识别库的面部图像识别系统的设计

基于OpenCV识别库的面部图像识别系统的设计 本系统采用J2EE技术并以OpenCV开源计算机视觉库技术为基础,实现一套具有身份验证功能的面部图像识别信息管理系统。系统使用MySQL数据库提供数据支撑,依托于J2EE的稳定性和Java平台的可移植性使得本系统可以在各个操作系统平台中运行,同时提供在互联网中使用面部识别技术的一套较为完备的解决方案。 标签:OpenCV;人脸识别;生物学特征 引言 随着信息技术的飞速发展以及互联网的深入普及,越来越多的行业和领域使用信息技术产品以提高工作效率和管理水平。但是由于人们隐私信息的保护意识薄弱,出现了许多信息安全的问题。在人们对于信息安全越来越重视的情况下,许多技术被应用到信息安全领域中来。较为先进的技术有虹膜识别技术、遗传基因识别技术以及指纹识别技术等。而论文采用的是当前热点的面部图像识别技术。 1 系统实现算法及功能分析 1.1 面部图像的生物学特征模型的建立 本系统是利用面部图形的生物学特征来识别不同的人。由于每个人的面部图像都有各自的特征但又具有一定的通性,需要应用生物学中相关知识加以解决。可以利用已有的生物学测量手段以及现有的算法构建人的面部图像生物学特征模型(简称:面部模型),并应用于系统中,面部模型的建立为面部图像识别的功能提供实现依据。 1.2 知识特征库及面部识别引擎的建立 在前述面部模型建立完成后,需要建立相应的知识库以及面部识别引擎方可进行身份的识别。可经过大量数据的采集和分析后建立知识库,并根据知识库的特点建立相应的识别引擎。此识别引擎对外开放,在本系统中提供其它外来程序的调用接口,其它系统能够通过本接口实现识别引擎的调用实现对于面部图形的识别,从而达到识别引擎的可复用性。在技术条件允许的情况下,提供知识库的智能训练以及半自动构建支持。 1.3 面部图像的采集与预处理 本系统中采用了预留API接口,利用USB图形捕获设备采集数据图像。经过USB设备的捕获,使用JMF(Java Media Framework)来处理已捕获的图像数据,对捕获的图像进行面部图行检测和实时定位跟踪。

opencv函数目录-Cv图像处理

目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp

图像管理方案计划opencv代码

/. #include "stdafx.h" #include "mymfc.h" #include "mymfcDlg.h" #include "afxdialogex.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CmymfcDlg 对话框

CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CmymfcDlg::IDD, pParent) , TheImage(NULL) , rePath(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CmymfcDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg) ON_BN_CLICKED(IDC_EdgeDetect, &CmymfcDlg::OnBnClickedEdgedetect) ON_BN_CLICKED(IDC_Refresh, &CmymfcDlg::OnBnClickedRefresh) ON_BN_CLICKED(IDC_GrayProcess, &CmymfcDlg::OnBnClickedGrayprocess) ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel) ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace) ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2) ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage) ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror) ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor) ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur) ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian) ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside) ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually) ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion) ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate) END_MESSAGE_MAP() // CmymfcDlg 消息处理程序 BOOL CmymfcDlg::OnInitDialog() { CDialogEx::OnInitDialog();

基于OpenCv的图像识别

基于2DPCA的人脸识别算法研究 摘要 人脸识别技术是对图像和视频中的人脸进行检测和定位的一门模式识别技术,包含位置、大小、个数和形态等人脸图像的所有信息。由于近年来计算机技术的飞速发展,为人脸识别技术的广泛应用提供了可能,所以图像处理技术被广泛应用了各种领域。该技术具有广阔的前景,如今已有大量的研究人员专注于人脸识别技术的开发。本文的主要工作内容如下: 1)介绍了人脸识别技术的基础知识,包括该技术的应用、背景、研究方向以及 目前研究该技术的困难,并对人脸识别系统的运行过程以及运行平台作了简单的介绍。 2)预处理工作是在原始0RL人脸库上进行的。在图像的预处理阶段,经过了图 象的颜色处理,图像的几何归一化,图像的均衡化和图象的灰度归一化四个过程。所有人脸图像通过上述处理后,就可以在一定程度上减小光照、背景等一些外在因素的不利影响。 3)介绍了目前主流的一些人脸检测算法,本文采用并详细叙述了Adaboost人脸 检测算法。Adaboost算法首先需要创建人脸图像的训练样本,再通过对样本的训练,得到的级联分类器就可以对人脸进行检测。 4)本文介绍了基于PCA算法的人脸特征点提取,并在PCA算法的基础上应用了 改进型的2DPCA算法,对两者的性能进行了对比,得出后者的准确度和实时性均大于前者,最后将Adaboost人脸检测算法和2DPCA算法结合,不仅能大幅度降低识别时间,而且还相互补充,有效的提高了识别率。 关键词:人脸识别 2DPCA 特征提取人脸检测

2DPCA Face Recognition Algorithm Based on The Research Abstract:Face recognition is a technology to detect and locate human face in an image or video streams,Including location, size, shape, number and other information of human face in an image or video streams.Due to the rapid development of computer operation speed makes the image processing technology has been widely applied in many fields in recent years. This paper's work has the following several aspects: 1)Explained the background, research scope and method of face recognition,and introduced the theoretical method of face recognition field in general. 2)The pretreatments work is based on the original ORL face database. In the image preprocessing stage, there are the color of the image processing, image geometric normalization, image equalization and image gray scale normalization four parts. After united processing, the face image is standard, which can eliminate the adverse effects of some external factors. 3)All kinds of face detection algorithm is introduced, and detailed describing the Adaboost algorithm for face detection. Through the Adaboost algorithm to create a training sample,then Training the samples of face image,and obtaining the cascade classifier to detect human face. 4)This paper introduces the facial feature points extraction based on PCA ,and 2DPCA is used on the basis of the PCA as a improved algorithm.Performance is compared between the two, it is concluds that the real time and accuracy of the latter is greater than the former.Finally the Adaboost face detection algorithm and 2DPCA are combined, which not only can greatly reduce the recognition time, but also complement each other, effectively improve the recognition rate. Key words:Face recognition 2DPCA Feature extraction Face detection

基于opencv对图像的预处理

基于opencv 对图像的预处理 1.问题描述 本次设计是基于opencv 结合c++语言实现的对图像的预处理,opencv 是用于开发实时的图像处理、计算机视觉及模式识别程序;其中图像的预处理也就是利用opencv 对图像进行简单的编辑操作;例如对图像的对比度、亮度、饱和度进行调节,同时还可以对图像进行缩放和旋转,这些都是图像预处理简单的处理方法;首先通过opencv 加载一幅原型图像,显示出来;设置五个滑动控制按钮,当拖动按钮时,对比度、亮度、饱和度的大小也会随之改变,也可以通过同样的方式调节缩放的比例和旋转的角度,来控制图像,对图像进行处理,显示出符合调节要求的图像,进行对比观察他们的之间的变化。 2.模块划分 此次设计的模块分为五个模块,滑动控制模块、对比度和亮度调节模块、饱和度调节模块、缩放调节模块、旋转调节模块,他们之间的关系如下所示: 图一、各个模块关系图 调用 调用 调用 调用 滑动控制模块 对比度和亮度调节模块 饱和度调节模块 缩放调节模块 旋转调节模块

滑动控制模块处于主函数之中,是整个设计的核心部分,通过createTrackbar创建五个滑动控制按钮并且调用每个模块实现对图像相应的调节。 3.算法设计 (1)滑动控制: 滑动控制是整个设计的核心部分,通过创建滑动控制按钮调节大小来改变相应的数据,进行调用函数实现对图像的编辑,滑动控制是利用createTrackbar(),函数中包括了滑动控制的名称,滑动控制显示在什么窗口上,滑动变量的地址和它调节的最大围,以及每个控制按钮应该调用什么函数实现什么功能; (2)对比度和亮度的调节: 对比度和亮度的调节的原理是依照线性理论,它的公式如下所示:g(x)=a* f(x) +b,其中f(x)表示源图像的像素,g(x)表示输出图像的像素,参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度,参数b通常被称为偏置(bias),常常被用来控制图像的亮度; (3)饱和度的调节: 饱和度调节利用cvCvtColor( src_image, dst_image, CV_BGR2HSV )将RGB 颜色空间转换为HSV颜色空间,其中“H=Hue”表示色调,“S=Saturation”表示饱和度,“V=Value ”表示纯度;所以饱和度的调节只需要调节S的大小,H 和V的值不需要做任何的改变; (4)旋转的调节: 旋转是以某参考点为圆心,将图像的个点(x,y)围绕圆心转动一个逆时针角度θ,变为新的坐标(x1,y1),x1=rcos(α+θ),y1=rsin(α+θ),其中r是图像的极径,α是图像与水平的坐标的角度的大小; (5)缩放的调节: 首先得到源图像的宽度x和高度y,变换后新的图像的宽度和高度分别为x1和y1,x1=x*f,y1=y*f,其中f是缩放因子; 4.函数功能描述 (1)主函数main()用来设置滑动控制按钮,当鼠标拖动按钮可以得到相应的数据大小,实现手动控制的功能,当鼠标拖动对比度和亮度调节是,主函数调用

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.sodocs.net/doc/2515999938.html,/technology/computing/opencv/?软件下载: https://www.sodocs.net/doc/2515999938.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

opencv最基础的图像处理

openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/

OpenCV图像处理篇之图像平滑

OpenCV图像处理篇之图像平滑 图像平滑算法 图像平滑与图像模糊是同一概念,主要用于图像的去噪。平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器,其统一形式如下: 其中h称为滤波器的核函数,说白了就是权值。不同的核函数代表不同的滤波器,有不同的用途。 在图像处理中,常见的滤波器包括: 1.归一化滤波器(Homogeneous blur) 也是均值滤波器,用输出像素点核窗口内的像素均值代替输出点像素值。 2.高斯滤波器(Guassian blur) 是实际中最常用的滤波器,高斯滤波是将输入数组的每一个像素点与高斯内核卷积将卷积和当作输出像素值。高斯核相当于对输出像素的邻域赋予不同的权值,输出像素点所在位置的权值最大(对应高斯函数的均值位置)。二维高斯函数为,

3.中值滤波器(median blur) 中值滤波将图像的每个像素用邻域(以当前像素为中心的正方形区域)像素的中值代替。对椒盐噪声最有效的滤波器,去除跳变点非常有效。 4.双边滤波器(Bilatrial blur) 为避免滤波器平滑图像,去噪的同时,使边缘也模糊,这种情况下使用双边滤波器。关于双边滤波器的解释参见 https://www.sodocs.net/doc/2515999938.html,/rbf/CVonline/LOCAL_COPIES/MA NDUCHI1/Bilateral_Filtering.html 下面的程序将先给标准Lena图像添加椒盐噪声,分别使用4种不同的滤波器进行平滑操作,请注意观察不同滤波器对椒盐噪声的去噪效果! 程序分析及结果

上面程序的逻辑非常清晰: 1.读入灰度图,并添加椒盐噪声(6000个噪声点):

最新基于OpenCV与深度学习框架的物体图像识别

基于OpenCV与深度学习框架Caffe的物体图像识别 摘要:本文主要介绍深度神经网络中的卷积神经的相关理论与技术。研究采用OpenCV深度学习模块DNN与深度学习框架Caffe进行物体识别。采用OpenCV 中的DNN模块加载深度学习框架Caffe模型文件,对物体图像进行识别。实验结果表明,卷积神经网络在物体的识别方面具有较高的准确率。 一.概述 1.1 OpenCV简介 OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV 是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。其最新版本是3.2,于2016年12月23日发布。OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。在其最新版3.2版本中,已经添加了深度神经网络模块,并支持深度学习框架Caffe模型(Caffe framework models)。 1.2 深度学习框架Caffe简介 Caffe(Convolutional Architecture for Fast Feature Embedding)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清,曾在Google 工作,现任Facebook研究科学家。Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换。Caffe的优势

图像处理经典算法及OpenCV程序

基于opencv的use摄像头视频采集程序 (1) 基于opencv的两个摄像头数据采集 (3) 能激发你用代码做视频的冲动程序 (6) 图像反转(就是把黑的变白,白的变黑) (11) 图像格式的转换 (12) 从摄像头或者A VI文件中得到视频流,对视频流进行边缘检测 (13) 采用Canny算子进行边缘检测 (15) 角点检测 (18) 图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) (21) Log-Polar极坐标变换 (22) 对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算) (24) 用不同的核进行图像的二维滤波 (27) 图像域的填充 (30) 寻找轮廓实现视频流的运动目标检测(超推荐一下) (35) 采用金字塔方法进行图像分割 (40) 图像的亮度变换 (43) 单通道图像的直方图 (46) 计算和显示彩色图像的二维色调-饱和度图像 (48) 图像的直方图均匀化 (50) 用Hongh变换检测线段 (52) 利用Hough变换检测圆(是圆不是椭圆) (57) 距离变换 (59) 椭圆曲线拟合 (64) 由点集序列或数组创建凸外形 (68) Delaunay三角形和V oronoi划分的迭代式构造 (71) 利用背景建模检测运动物体(推荐) (78) 运动模板检测(摄像头) (81) 显示如何利用Camshift算法进行彩色目标的跟踪 (86) 基于opencv的use摄像头视频采集程序 准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。 建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码: #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include "highgui.h"

OPENCV图像处理常用函数

图像处理和图像识别中常用的OpenCV函数 2011-02-21 19:25:42|分类:默认分类|字号订阅 1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存; 9、cvReleaseCapture:释放CvCapture结构开辟的内存空间; 10、cvCreateTrackbar:创建一个滚动条; 11、cvSetCaptureProperty:设置CvCapture对象的各种属性; 12、cvGetCaptureProperty:查询CvCapture对象的各种属性; 13、cvGetSize:当前图像结构的大小; 14、cvSmooth:对图像进行平滑处理; 15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一; 16、cvCanny:Canny边缘检测; 17、cvCreateCameraCapture:从摄像设备中读入数据; 18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件; 19、cvWriteFrame:逐帧将视频流写入文件; 20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间; 21、CV_MAT_ELEM:从矩阵中得到一个元素;

基于qt+opencv数字图像处理实验一般步骤

基于QtCreator+openCV的数字图像处理实验一般步骤 一、新建Qt Widgets Application项目 二、设计应用界面 1.拖放所需控件 2.应用布局 3.修改界面各个对象的文本和名称 三、复制图像类型转换类单元文件到项目文件夹 Imageconversion是用于Qt图像对象类型与OpenCV图像对象类型直接的转换,是整理自网络,把这两个文件复制到项目文件夹下,方便使用。 四、在构建文件和有关文件头包含openCV库 1. 在项目文件“项目名称.pro”文件(*.pro 基本上是构建工程项目时由Qt 处理的第一个文件,这个文件称为Qt 项目文件,一个名为“qmake”的内部Qt 程序负责处理该文件最后添加如下指令语句: include(E:\openCV\opencv331.pri) 看起来是这样的:

其中opencv331.pri的文件含openCV包含路径和库文件路径,可以把这些路径信息直接一一写在Qt项目文件中,但是比较麻烦。把这些路径信息统一写在一个文件里面,方便使用。这个需要根据用户的实际安排情况调整,我的opencv331.pri文件内容如下: INCLUDEPATH+=E:\openCV\opencv331build\install\include LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_core331.dll LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_highgui331.dll LIBS+= E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_imgcodecs331.dll LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_imgproc331.dll LIBS+= E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_features2d331.dll LIBS+=E:\openCV\opencv331build\install\x86\mingw\bin\libopencv_calib3d331.dll 2.在头文件中包含opencv、图像数据类型转换以及常用Qt控件 #include//Qt图像类,适用于屏显 #include//打开文件对话框 #include//文件信息类 #include//用于管理2D图形对象 #include//Qt字符串类 #include//弹出窗口类 #include//openCV头文件 #include//OpenCV头文件 #include"imageconversion.h"//图像数据类型转换 using namespace cv; 五、在mainwindow.h声明私有数据成员 1. 与图像读、写和显示有关的几个数据成员: QGraphicsScene sceneL,sceneR,scene;//与QgraphicsView配合显示图像 QPixmap pixmapL,pixmapR,pixmap; //用于读、写图像 //以后参数根据需要定义

基于OpenCV的图像处理

基于OpenCV的图像处理Image Processing Based On OpenCV 摘要:OpenCV是近年来最受欢迎的计算机视觉应用库。在其基础上编写图像处理代码效率得到有效提高。本文旨在对OpenCV进行一个快速全面简介,通过介绍其数据结构、HighGUI库,图像处理函数使读者能快速形成对OpenCV印象。文章详细介绍了2.4.4版本在VS2010中的安装测试说明。读者能够在此基础上架构自己代码。文章最后通过自适应阈值分割实例来介绍OpenCV的具体应用。 关键词:OpenCV VS2010 图像处理KeyWords: OpenCV VS2010 image processing Abstract: OpenCV is one of the most popular computer vision library in recent years. Prepared on the basis of its image processing code efficiency improved effectively. This paper aims to OpenCV for a rapid and comprehensive introduction, through the presentation of its data structures, HighGUI libraries, image processing functions so that readers can quickly form on the OpenCV impression. Finally, version 2.4.4 introduced in detail the installation in VS2010 test instructions. On this basis, the reader can structure their own code. Finally, the paper uses adaptive thresholding examples to introduce specific application of OpenCV. OpenCV诞生于Inter研究中心,采用C/C++编写,包含覆盖计

毕业设计:基于OpenCV的人脸识别算法(终稿)-精品

安徽工业大工商学院 毕业学士论文 基于OpenCV的人脸识别算法 姓名:陈滔 申请学位级别:学士专业:测控技术与仪器 指导教师:方挺

摘要 人脸在社会交往中扮演着十分重要的角色,是人类在确定一个人身份时所采用的最普通的生物特征,研究人脸跟踪识别及其相关技术具有十分重要的理论价值和应用价值。彩色图像序列的人脸检测、跟踪与识别技术是随着计算机技术的高速发展和视频监控等应用的需要在近几年才逐渐成为一个研究热点。本文着重构建一套人脸跟踪识别系统,致力于精确实时地对彩色视频中的人脸图像检测跟踪,并可以将跟踪到的人脸图片传输到识别端进行身份识别。系统分为客户端和服务器两部分。针对传统Camshifl跟踪算法进行形态学处理、分配多个跟踪器等改进后的算法应用于客户端进行多人脸的跟踪。服务器端首先将人脸图像按其主要特征进行分块,再对分块图执行Eigenface算法实现人脸身份的识别。这套系统完成了对多人脸的跟踪效果,可广泛的应用于各种安防系统之中如:ATM机监控系统,门禁系统等。

Abstract Human face is 0111"primary focus of attention in social intercourse playingamajor rolei conveying dentity and emotion.Researchonthe face tracking,recognition technology has great theoreticaland practical value.This paper focusesOilbuildingasetofhumanface recognition and trackingsystem tocommitted toaccurate and real-timecolorvideoimages,andcalltransmit the tracked human face image to the recognition part to identify the person’S status.Thesystem is divided into client and server parts.Thetracking algorithm whichcarrieson morphology processing after traditional track algorithm Camshifl and assignments severaltrackingdevices is applied to the client for duplex facetracking.Theserver—side first divides the person face image into blocksaccording to its chief feature,then the blocksuses the Eigenfacealgorithm separately to realize the person’S status recognition.The system implementation for multiple face trackingcallbe widelyused among the various security systems,suchas:ATM machine monitoring system,accesscontrol system.Keywords:Face DetectionFace TrackingFace Recognition Eigenface Camshift

相关主题