搜档网
当前位置:搜档网 › 图像处理经典算法及OpenCV程序

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

图像处理经典算法及OpenCV程序
图像处理经典算法及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"

void callback(IplImage* image);

int main()

{

int ncams=cvcamGetCamerasCount( );//返回可以访问的摄像头数目

HWND MyWin;

// 设置系统属性

cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //选择第一个摄像

//camera

cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE); //We'll render stream

// 在本例中

// 假设创建一个窗口,并且窗口的ID是在变量 MyWin 中定义

// MyWin 是窗口 HWND 的类型

MyWin=(HWND)cvGetWindowHandle("CameraUSB window");

cvcamSetProperty(0,CVCAM_PROP_WINDOW,&MyWin); // Selects a window for

//video rendering

//回调函数将处理每一帧

cvcamSetProperty(0,CVCAM_PROP_CALLBACK,callback);

cvcamInit( );

cvcamStart( );

// 现在程序开始工作

cvWaitKey(0);

cvcamStop( );

cvcamExit( );

return 0;

}

// 在图像中画兰色水平线

void callback(IplImage* image)

{

IplImage* image1 = image;

int i,j;

assert (image);

for(i=0; iheight; i+=10)

{

for(j=(image1->widthStep)*i; j<(image1->widthStep)*(i+1);

j+=image1->nChannels)

{

image1->imageData[j] = (char)255;

image1->imageData[j+1] = 0;

image1->imageData[j+2] = 0;

}

}

}

嘿嘿,就这么简单就完事了。

不懂可留言问

基于opencv的两个摄像头数据采集

实现功能:同时采集两路USB摄像头数据,并显示,具有图片保存功能(点击左键保存图片,并暂停视频;右键继续视频)。步骤就不说了,很简单,直接放代码了:

#include

#include

#include

#include "stdio.h"

#include

void StereoCallback(IplImage *frame1,IplImage *frame2);

void onMouse1(int Event,int x,int y,int flags,void *param);

void onMouse2(int Event,int x,int y,int flags,void *param);

IplImage *image1,*image2;

char *strleft[4]={"left1.bmp","left2.bmp","left3.bmp","left4.bmp"}; char

*strright[4]={"right1.bmp","right2.bmp","right3.bmp","right4.bmp"};

void main()

{

HWND CaptureWindow1=0; //不赋值也行

HWND CaptureWindow2=0;

//int ncams=cvcamGetCamerasCount(); //获取摄像头的个数,在这里可有可无//用对话框的形式来选取摄像头

int *CameraNumber;

int nSelected = cvcamSelectCamera(&CameraNumber);

/* //灰色图像

image1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);

image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,1);

*/

//彩色图像

image1=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);

image2=cvCreateImage(cvSize(320,240),IPL_DEPTH_8U,3);

//初始化两个摄像头

cvNamedWindow("cvcam1 Window",1);

CaptureWindow1=(HWND)cvGetWindowHandle("cvcam1 Window");

cvcamSetProperty(CameraNumber[0], CVCAM_PROP_ENABLE, CVCAMTRUE);

cvcamSetProperty(CameraNumber[0], CVCAM_PROP_RENDER, CVCAMTRUE);

cvcamSetProperty(CameraNumber[0], CVCAM_PROP_WINDOW,

&CaptureWindow1);

// cvSetMouseCallback("cvcam1 Window",onMouse1,0);

cvNamedWindow("cvcam2 Window",1);

CaptureWindow2=(HWND)cvGetWindowHandle("cvcam2 Window");

cvcamSetProperty(CameraNumber[1], CVCAM_PROP_ENABLE, CVCAMTRUE);

cvcamSetProperty(CameraNumber[1], CVCAM_PROP_RENDER, CVCAMTRUE);

cvcamSetProperty(CameraNumber[1], CVCAM_PROP_WINDOW,

&CaptureWindow2);

// cvSetMouseCallback("cvcam2 Window",onMouse2,0);

//让两个摄像头同步

cvcamSetProperty(CameraNumber[0],CVCAM_STEREO_CALLBACK,(void*)&Ste reoCallback);

//启动程序

cvcamInit();

cvcamStart();

cvSetMouseCallback("cvcam1 Window",onMouse1,0);

cvSetMouseCallback("cvcam2 Window",onMouse2,0);

cvWaitKey(0);

cvcamStop();

free(CameraNumber);

cvcamExit();

cvDestroyWindow("cvcam1 Window");

cvDestroyWindow("cvcam2 Window");

}

void StereoCallback(IplImage* frame1,IplImage *frame2)

{

/* //把图像转换成灰度图并保存到image中

cvCvtColor(frame1,image1,CV_RGB2GRAY);

cvCvtColor(frame2,image2,CV_RGB2GRAY);

*/

//拷贝图像到全局变量image中该函数这样用存在问题

// cvCopy(frame1,image1);

// cvCopy(frame2,image2);

image1=cvCloneImage(frame1);

image2=cvCloneImage(frame2);

//对截取的图像翻转

cvFlip(image1,image1,0);

cvFlip(image2,image2,0);

}

void onMouse1(int Event,int x,int y,int flags,void *param)

{

static int num=0;

if(Event==CV_EVENT_LBUTTONDOWN)

{

if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原

cvcamPause();

//图像保存

cvSaveImage(strleft[num],image1);

// cvSaveImage(strright[num],image2);

// cvSaveImage("left.bmp",image1);

// cvSaveImage("right.bmp",image2);

}

if(Event==CV_EVENT_RBUTTONDOWN)

{

cvcamResume();

num++;

}

}

void onMouse2(int Event,int x,int y,int flags,void *param)

{

static int num=0;

if(Event==CV_EVENT_LBUTTONDOWN)

{

if(num==4)num=0;//只是固定定义了保存4张图片,为了不让程序非法而设置的复原

cvcamPause();

//图像保存

// cvSaveImage(strleft[num],image1);

cvSaveImage(strright[num],image2);

// cvSaveImage("left.bmp",image1);

// cvSaveImage("right.bmp",image2);

}

if(Event==CV_EVENT_RBUTTONDOWN)

{

cvcamResume();

num++;

}

}

能激发你用代码做视频的冲动程序

这个程序是基于opencv的,连接库就不说了,直接建立一个基于win32的控制台程序,写代码就OK了。

/* 程序名:drawing..c

功能:展示OpenCV的图像绘制功能

*/

#include "cv.h"

#include "highgui.h"

#include

#include

#define NUMBER 100

#define DELAY 5

char wndname[] = "Drawing Demo";

CvScalar random_color(CvRNG* rng) //函数 cvRNG 初始化随机数生成器并返回其状态,RNG 随机数生成器

{

int icolor = cvRandInt(rng); //函数 cvRandInt 返回均匀分布的随机32-bit 无符号整型值并更新 RNG 状态

return CV_RGB(icolor&255, (icolor>>8)&255, (icolor>>16)&255); //

创建一个色彩值

}

int main( int argc, char** argv )

{

int line_type = CV_AA; // change it to 8 to see non-antialiased graphics

int i;

CvPoint pt1,pt2; //基于二维整形坐标轴的点

double angle;

CvSize sz; //矩形框大小,以像素为精度

CvPoint ptt[6];

CvPoint* pt[2];

int arr[2];

CvFont font;

CvRNG rng;

int width = 1000, height = 700;

int width3 = width*3, height3 = height*3;

CvSize text_size;

int ymin = 0;

// Load the source image

IplImage* image = cvCreateImage( cvSize(width,height), 8, 3 );

IplImage* image2;

// Create a window

cvNamedWindow(wndname, 1 );

cvZero( image ); //#define cvZero cvSetZero void cvSetZero( CvArr* arr ); arr 要被清空数组

cvShowImage(wndname,image);

rng = cvRNG((unsigned)-1);

pt[0] = &(ptt[0]);

pt[1] = &(ptt[3]);

arr[0] = 3;

arr[1] = 3;

for (i = 0; i< NUMBER; i++)

{

pt1.x=cvRandInt(&rng) % width3 - width;

pt1.y=cvRandInt(&rng) % height3 - height;

pt2.x=cvRandInt(&rng) % width3 - width;

pt2.y=cvRandInt(&rng) % height3 - height;

cvLine( image, pt1, pt2, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );//绘制连接两个点的线段

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 0; i< NUMBER; i++)

{

pt1.x=cvRandInt(&rng) % width3 - width;

pt1.y=cvRandInt(&rng) % height3 - height;

pt2.x=cvRandInt(&rng) % width3 - width;

pt2.y=cvRandInt(&rng) % height3 - height;

cvRectangle( image,pt1, pt2, random_color(&rng),

cvRandInt(&rng)%10-1, line_type, 0 );//绘制简单、指定粗细或者带填充的矩形

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 0; i< NUMBER; i++)

{

pt1.x=cvRandInt(&rng) % width3 - width;

pt1.y=cvRandInt(&rng) % height3 - height;

sz.width =cvRandInt(&rng)%200;

sz.height=cvRandInt(&rng)%200;

angle = (cvRandInt(&rng)%1000)*0.180;

cvEllipse( image, pt1, sz, angle, angle - 100, angle + 200,

random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );//函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 0; i< NUMBER; i++)

{

pt[0][0].x=cvRandInt(&rng) % width3 - width;

pt[0][0].y=cvRandInt(&rng) % height3 - height;

pt[0][1].x=cvRandInt(&rng) % width3 - width;

pt[0][1].y=cvRandInt(&rng) % height3 - height;

pt[0][2].x=cvRandInt(&rng) % width3 - width;

pt[0][2].y=cvRandInt(&rng) % height3 - height;

pt[1][0].x=cvRandInt(&rng) % width3 - width;

pt[1][0].y=cvRandInt(&rng) % height3 - height;

pt[1][1].x=cvRandInt(&rng) % width3 - width;

pt[1][1].y=cvRandInt(&rng) % height3 - height;

pt[1][2].x=cvRandInt(&rng) % width3 - width;

pt[1][2].y=cvRandInt(&rng) % height3 - height;

cvPolyLine( image, pt, arr, 2, 1, random_color(&rng), cvRandInt(&rng)%10, line_type, 0 );//函数cvPolyLine 绘制一个简单的或多样的多角曲线

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 0; i< NUMBER; i++)

{

pt[0][0].x=cvRandInt(&rng) % width3 - width;

pt[0][0].y=cvRandInt(&rng) % height3 - height;

pt[0][1].x=cvRandInt(&rng) % width3 - width;

pt[0][1].y=cvRandInt(&rng) % height3 - height;

pt[0][2].x=cvRandInt(&rng) % width3 - width;

pt[0][2].y=cvRandInt(&rng) % height3 - height;

pt[1][0].x=cvRandInt(&rng) % width3 - width;

pt[1][0].y=cvRandInt(&rng) % height3 - height;

pt[1][1].x=cvRandInt(&rng) % width3 - width;

pt[1][1].y=cvRandInt(&rng) % height3 - height;

pt[1][2].x=cvRandInt(&rng) % width3 - width;

pt[1][2].y=cvRandInt(&rng) % height3 - height;

cvFillPoly( image, pt, arr, 2, random_color(&rng), line_type, 0 );//函数cvFillPoly用于一个单独被多变形轮廓所限定的区域内进行填充

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 0; i< NUMBER; i++)

{

pt1.x=cvRandInt(&rng) % width3 - width;

pt1.y=cvRandInt(&rng) % height3 - height;

cvCircle( image, pt1, cvRandInt(&rng)%300, random_color(&rng), cvRandInt(&rng)%10-1, line_type, 0 );//函数cvCircle 绘制或填充一个给定圆心和半径的圆

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

for (i = 1; i< NUMBER; i++)

{

pt1.x=cvRandInt(&rng) % width3 - width;

pt1.y=cvRandInt(&rng) % height3 - height;

cvInitFont( &font, cvRandInt(&rng) % 8,

(cvRandInt(&rng)%100)*0.05+0.1,

(cvRandInt(&rng)%100)*0.05+0.1,

(cvRandInt(&rng)%5)*0.1, cvRound(cvRandInt(&rng)%10),

line_type );//字体结构初始化。函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值

cvPutText( image, "Northeast Petroleum University!", pt1, &font, random_color(&rng));//在图像中加入文本

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 3, 3, 0.0, 5,

line_type );

cvGetTextSize( "Opencv forever!", &font, &text_size, &ymin );//设置字符串文本的宽度和高度

pt1.x = (width - text_size.width)/2;

pt1.y = (height + text_size.height)/2;

image2 = cvCloneImage(image);

for( i = 0; i < 255; i++ )

{

cvSubS( image2, cvScalarAll(i), image, 0 );//函数 cvSubS 从原数组的每个元素中减去一个数量

cvPutText( image, "shentuhongfeng forever!", pt1, &font, CV_RGB(255,i,i));

cvShowImage(wndname,image);

cvWaitKey(DELAY);

}

// Wait for a key stroke; the same function arranges events processing cvWaitKey(0);

cvReleaseImage(&image);

cvReleaseImage(&image2);

cvDestroyWindow(wndname);

return 0;

}

效果图:太帅了

图像反转(就是把黑的变白,白的变黑)

黑的变白了,白的变黑了

源码:

#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:InvImage\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%d*%d image with %d

channels\n",height,width,channels);

cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin",100,100);

for(i=0;i

for(j=0;j

for(k=0;k

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

cvShowImage("mainWin",img);

cvWaitKey(0);

cvReleaseImage(&img);

return 0;

}

图像格式的转换

首先要准备一张图片,和几个txt文档,把txt文档的扩展名改成一个你要把图片转换成的格式

我用的原始图片是jpg的,txt改成bmp的

使用时,运行-cmd-cd 转到你的目录- Convert.exe 1.jpg 2.bmp 运行就能把图像1.jpg转换成2.bmp了

源码如下:

/* 程序名:convert.c

功能:图像格式的转换

*/

#include

#include

#include

int main( int argc, char** argv )

{

IplImage* src;

// -1: the loaded image will be loaded as is (with number of channels depends on the file).

if(argc != 3)

{

printf("CONV: Image format convertion, support

JPG,BMP,TIF,PNG,PPM\n");

printf("Usage: conv srcImage dstImage\n");

return 0;

}

if( ( strstr(argv[1],".jpg")==NULL

&& strstr(argv[1],".bmp")==NULL

&& strstr(argv[1],".tif")==NULL

&& strstr(argv[1],".png")==NULL

&& strstr(argv[1],".ppm")==NULL )

|| ( strstr(argv[2],".jpg")==NULL

&& strstr(argv[2],".bmp")==NULL

&& strstr(argv[2],".tif")==NULL

&& strstr(argv[2],".png")==NULL

&& strstr(argv[2],".ppm")==NULL )) //strstr(a, b)的用法是不是在a数组内查看是否有b数组。。。没有则输出NULL

{

printf("WARNING: CONV only support JPG,BMP,TIF,PPM,TGA and PPM\n"); }

else {

if( (src=cvLoadImage(argv[1], -1))!= 0 ) {

cvSaveImage( argv[2], src);

cvReleaseImage(&src);

printf("\n Convert successfully.\n");

}

else

{

printf("\n*** Read or write image fails *** \n");

}

}

return 0;

}

发现了个小问题:

原来的jpg图像只有102KB转换成bmp后变成549KB ,在运行程序把这个bmp

转成jpg又只有81KB。这真是汗死我了

从摄像头或者A VI文件中得到视频流,对视频流进行边缘检测

/*

程序名称:laplace.c

功能:从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。

*/

#include "cv.h"

#include "highgui.h"

#include

#include

int main( int argc, char** argv )

{

IplImage* laplace = 0;

IplImage* colorlaplace = 0;

IplImage* planes[3] = { 0, 0, 0 }; // 多个图像面

CvCapture* capture = 0;

// 下面的语句说明在命令行执行程序时,如果指定AVI文件,那么处理从// AVI文件读取的视频流,如果不指定输入变量,那么处理从摄像头获取

// 的视频流

if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 ); else if( argc == 2 )

capture = cvCaptureFromAVI( argv[1] );

if( !capture )

{

fprintf(stderr,"Could not initialize capturing...\n");

return -1;

}

cvNamedWindow( "Laplacian", 0 );

// 循环捕捉,直到用户按键跳出循环体

for(;;)

{

IplImage* frame = 0;

int i;

frame = cvQueryFrame( capture );

if( !frame )

break;

if( !laplace )

{

for( i = 0; i < 3; i++ )

planes[i] =

cvCreateImage( cvSize(frame->width,frame->height), 8, 1 );

laplace = cvCreateImage( cvSize(frame->width,frame->height),

IPL_DEPTH_16S, 1 );

colorlaplace =

cvCreateImage( cvSize(frame->width,frame->height), 8, 3 );

}

cvCvtPixToPlane( frame, planes[0], planes[1], planes[2], 0 ); for( i = 0; i < 3; i++ )

{

cvLaplace( planes[i], laplace, 3 ); // 3: aperture_size cvConvertScaleAbs( laplace, planes[i], 1, 0 ); // planes[] = ABS(laplace)

}

cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, colorlaplace );

colorlaplace->origin = frame->origin;

cvShowImage("Laplacian", colorlaplace );

if( cvWaitKey(10) >= 0 )

break;

}

cvReleaseCapture( &capture );

cvDestroyWindow("Laplacian");

return 0;

}

采用Canny算子进行边缘检测

#include "cv.h"

#include "highgui.h"

char wndname[] = "Edge";

char tbarname[] = "Threshold";

int edge_thresh = 1;

IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0;

// 定义跟踪条的 callback 函数

void on_trackbar(int h)

{

cvSmooth( gray, edge, CV_BLUR, 3, 3, 0 );

cvNot( gray, edge );

// 对灰度图像进行边缘检测

cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3); cvZero( cedge );

// copy edge points

cvCopy( image, cedge, edge );

// 显示图像

cvShowImage(wndname, cedge);

}

int main( int argc, char** argv )

{

char* filename = argc == 2 ? argv[1] : (char*)"fruits.jpg";

if( (image = cvLoadImage( filename, 1)) == 0 )

return -1;

// Create the output image

cedge = cvCreateImage(cvSize(image->width,image->height),

IPL_DEPTH_8U, 3);

// 将彩色图像转换为灰度图像

gray = cvCreateImage(cvSize(image->width,image->height),

IPL_DEPTH_8U, 1);

edge = cvCreateImage(cvSize(image->width,image->height),

IPL_DEPTH_8U, 1);

cvCvtColor(image, gray, CV_BGR2GRAY);

// Create a window

cvNamedWindow(wndname, 1);

// create a toolbar

cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100,

on_trackbar);

// Show the image

on_trackbar(1);

// Wait for a key stroke; the same function arranges events processing cvWaitKey(0);

cvReleaseImage(&image);

cvReleaseImage(&gray);

cvReleaseImage(&edge);

cvDestroyWindow(wndname);

return 0;

}

/*******代码中的函数说明

1、cvSmooth,其函数声明为:

cvSmooth( const void* srcarr, void* dstarr, int smoothtype,int param1, int param2, double param3 )

cvSmooth函数的作用是对图象做各种方法的图象平滑。其中,srcarr为输入图象;dstarr为输出图象;

param1为平滑操作的第一个参数;param2为平滑操作的第二个参数(如果param2值为0,则表示它被设为param1);

param3是对应高斯参数的标准差。

参数smoothtype是图象平滑的方法选择,主要的平滑方法有以下五种:

CV_BLUR_NO_SCALE:简单不带尺度变换的模糊,即对每个象素在param1×param2领域求和。

CV_BLUR:对每个象素在param1×param2邻域求和并做尺度变换 1/

(param1?param2)。

CV_GAUSSIAN:对图像进行核大小为param1×param2的高斯卷积。

CV_MEDIAN:对图像进行核大小为param1×param1 的中值滤波(邻域必须是方的)。

CV_BILATERAL:双向滤波,应用双向 3x3 滤波,彩色设置为param1,空间设置为param2。

2、void cvNot(const CvArr* src,CvArr* dst);

函数cvNot()会将src中的每一个元素的每一位取反,然后把结果赋给dst。

因此,一个值为0x00的8位图像将被映射到0xff,而值为0x83的图像将被映

射到0x7c。

3、void cvCanny( const CvArr* image, CvArr* edges, double

threshold1,double threshold2, int aperture_size=3 );

采用 Canny 算法做边缘检测

image

输入图像

edges

输出的边缘图像

threshold1

第一个阈值

threshold2

第二个阈值

aperture_size

Sobel 算子内核大小

4、void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL ); 在使用这个函数之前,你必须用cvCreateImage()一类的函数先开一段内存,然后传递给dst。

cvCopy会把src中的数据复制到dst的内存中。

5、cvCreateTrackbar

创建trackbar并将它添加到指定的窗口。

int cvCreateTrackbar( const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change );

trackbar_name

被创建的trackbar名字。

window_name

窗口名字,这个窗口将为被创建trackbar的父对象。

value

整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。count

滑块位置的最大值。最小值一直是0。

on_change

每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int);

如果没有回调函数,这个值可以设为NULL。

函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,

并且指定当trackbar位置被改变的时候调用的回调函数。被创建的trackbar 显示在指定窗口的顶端。

*/

角点检测

原始图:

处理后图:

源代码:

#include

#include "cv.h"

#include "highgui.h"

#define max_corners 100

int main( int argc, char** argv )

{

int cornerCount=max_corners;

CvPoint2D32f corners[max_corners];

IplImage *srcImage = 0, *grayImage = 0, *corners1 = 0, *corners2 = 0;

int i;

CvScalar color = CV_RGB(255,0,0);

char* filename = argc == 2 ? argv[1] : (char*)"pic3.png"; // 注意相对路径

cvNamedWindow( "image", 1 ); // create HighGUI window with name "image"

//Load the image to be processed

srcImage = cvLoadImage(filename, 1);

grayImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 1);

//copy the source image to copy image after converting the format

cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);

//create empty images of same size as the copied images

corners1= cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_32F, 1); corners2= cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_32F, 1);

cvGoodFeaturesToTrack (grayImage, corners1,

corners2, corners,

&cornerCount, 0.05,

5,

0,

3, // block size

0, // not use harris

0.4 );

printf("num corners found: %d\n", cornerCount);

// draw circles at each corner location in the gray image and

//print out a list the corners

if(cornerCount>0)

{

for (i=0; i

{

cvCircle(srcImage, cvPoint((int)(corners[i].x),

(int)(corners[i].y)), 6,

color, 2, CV_AA, 0);

}

}

cvShowImage( "image", srcImage );

cvReleaseImage(&srcImage);

cvReleaseImage(&grayImage);

cvReleaseImage(&corners1);

cvReleaseImage(&corners2);

cvWaitKey(0); // wait for key. The function has

return 0;

}

友情链接一下,这是别人写的:

https://www.sodocs.net/doc/457634837.html,/xiaoduo170/blog/item/2816460175c8330779ec2c64.htm l

图像处理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函数目录-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对图像的预处理

基于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/457634837.html,/technology/computing/opencv/?软件下载: https://www.sodocs.net/doc/457634837.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/457634837.html,/rbf/CVonline/LOCAL_COPIES/MA NDUCHI1/Bilateral_Filtering.html 下面的程序将先给标准Lena图像添加椒盐噪声,分别使用4种不同的滤波器进行平滑操作,请注意观察不同滤波器对椒盐噪声的去噪效果! 程序分析及结果

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

图像处理经典算法及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 编程简介教程(中文版),Image Processing, C

Open Source Computer Vision Library intro.html#SECTION00040000000000000000 https://www.sodocs.net/doc/457634837.html,/chenyusiyuan/archive/2010/01/26/5259060.aspx

2.2 2、输入处理 2.2.1 (1)处理鼠标事件: 2.2.2 (2)处理键盘事件: 2.2.3 (3)处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1) IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1)矩阵: 3.2.2 (2)一般矩阵: 3.2.3 (3)标量: 3.3 3、其它结构类型 3.3.1 (1)点: 3.3.2 (2)矩形框大小(以像素为精度): 3.3.3 (3)矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1)分配内存给一幅新图像: 4.1.2 (2)释放图像: 4.1.3 (3)复制图像: 4.1.4 (4)设置/获取感兴趣区域ROI: 4.1.5 (5)设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1)从文件中读入图像: 4.2.2 (2)保存图像: 4.3 3、访问图像像素 4.3.1 (1)假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2)间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3)直接访问: (效率高,但容易出错) 4.3.4 (4)基于指针的直接访问: (简单高效) 4.3.5 (5)基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1)字节型图像的灰度-彩色转换: 4.4.2 (2)彩色图像->灰度图像: 4.4.3 (3)不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1)绘制矩形: 4.5.2 (2)绘制圆形: 4.5.3 (3)绘制线段: 4.5.4 (4)绘制一组线段: 4.5.5 (5)绘制一组填充颜色的多边形: 4.5.6 (6)文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1)总体上: 5.1.2 (2)为新矩阵分配内存: 5.1.3 (3)释放矩阵内存: 5.1.4 (4)复制矩阵: 5.1.5 (5)初始化矩阵: 5.1.6 (6)初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1)假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2)间接访问: 5.2.3 (3)直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4)直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5)对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算

OPENCV图像处理的函数说明

? Open Source Computer Vision Library ? ? 论坛 ? 商业 ? 专题 ? 讲座 ? 例程 ? 安装 ? 常见问题 ? 函数说明 Cv 图像处理 Wikipedia ,自由的百科全书 注意:本章描述图像处理和分析的一些函数。大多数函数都是针对两维象素数组的,这里,我们称这些数组为“图像”,但是它们不一定非得是IplImage 结构,也可以是CvMat 或者CvMatND 结构。 目录 [隐藏] ? 1 梯度、边缘和角点 o 1.1 Sobel o 1.2 Laplace

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

基于OpenCV的图像处理方法

龙源期刊网 https://www.sodocs.net/doc/457634837.html, 基于OpenCV的图像处理方法 作者:陈博华戴少鹏 来源:《电子技术与软件工程》2015年第19期 摘要OpenCV是近年来刚研发出来的一种借助计算机使用的视觉数据库,其可以免费的 为用户提供大量的图像处理技术,而且能够运用函数,实现数字图像和视频的制作与处理,而且,能够借助计算机编程技术,运用C语言对程序进行编写,从而能够提高图像处理的效率。本文作者依据多年实际工作经验,对OpenCV的图像处理方法研究分析,以便与同行切磋、交流。 【关键词】OpenCV 平滑处理图像形态学 在人们生活的环境中,很多事物都是以图像的形式展现出来的,而且通过对图像的处理,能够使抽象的图像给人们留下深刻的印象。现在,图像处理技术的应用日益广泛,能够用于不同的部门,而且能够对图像进行数字化的处理,对图像进行压缩和效果增强。图像技术借助了计算机技术,图像的处理效果更加逼真,而且效率更高,采用C语言编程技术,能够使图像达到更好的视觉效果。OpenCV图像处理技术是一款免费的软件,而且能够借助丰富的函数对不同的图像信息进行识别,提高了图像处理的效率。 1 OpenCV OpenCV是在网络研究中心产生的一类图像处理技术,其是一个开放的源码构成的,借助了计算机技术,形成的一个视觉数据库。OpenCV在进行图像处理的过程中,使用的是C语言的编写,而且能够在不同的操作系统上进行使用,而且能够根据不同的语言,选择不同的接口,其兼容性比较高。OpenCV软件中的函数就有500多个,几乎能够包含所有的视觉应用,其结构主要有五个部分组成,其中的四个部分如图1 所示。 在图1中,没有显示的是Cvaus组件,这个部分主要是将那些不能使用的函数和算法储存在一起,而且,能够对一些新出现的算法和函数进行归纳。OpenCV软件的优点还是比较多的,主要有以下几点: 1.1 OpenCV能够进行跨平台使用,具有兼容性 OpenCV软件能够在不同的平台上使用,其处理的图像具有移植的功能,其平台主要是由中、高平台构成,而且能够支持不同的系统的操作,而且都能够使用C语言编程。 1.2 OpenCV软件具有独立性 OpenCV自身就带有500个函数,可以不依赖其他的系统和软件,也不用依靠其他的数据库提供资源,而且能够进行独立的运行,在运行的过程中也可以使用其他的数据库。

Opencv图像处理函数及其应用

搜索文档搜索论坛■ Open Source Computer Vision Library ■ ■ 论坛 ■ 商业 ■ 专题 ■ 讲座 ■ 例程 ■ 安装 ■ 常见问题 函数说明 ■ Cv图像处理 Wikipedia,自由的百科全书 注意:本章描述图像处理和分析的一些函数。大多数函数都是针对两维象素数组的,这里,我们称这些数组为“图像”,但是它们不一定非得是IplImage 结构,也可以是CvMat或者CvMatND结构。 目录 ■ 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 形态学操作

OpenCV特征提取与图像检索实现(附代码)

OpenCV特征提取与图像检索实现(附代码) “拍立淘”“一键识花”“街景匹配”……不知道大家在使用 这些神奇的功能的时候,有没有好奇过它们背后的技术原理?其实这些技术都离不开最基本的图像检索技术。本篇文章我们就将对这一技术的原理进行介绍,并通过一个简单的Python脚本来实现一个最基本的图像检索demo。 ▌图像特征 首先我们需要明白图像特征是什么以及它的使用方法。 图像特征是一种简单的图像模式,基于这种模式我们可以描述我们在图像上所看到的内容。例如,在一张跟猫有关的 图片中,猫咪的眼睛就可以作为这幅图像的特征。特征在(包括但不限于)计算机视觉中的主要作用是将视觉信息转换为向量空间表示。这种向量空间表示让我们可以利用数学运算对其进行处理,例如通过计算寻找相似向量(这可以用来寻找相似图像或图像中的相似目标)。 ▌如何从图像中获取特征? 从图像中获取特征的方法有两种,第一种是通过提取图像描述符实现(白盒算法);第二种通过基于神经网络的方法实 现(黑盒算法)。本文主要介绍第一种方法。 特征提取的算法有很多,最常用的有:SURF、ORB、SIFT、BRIEF等。这些算法大多是基于图像梯度的。为了简化安装

需求,本教程使用的是KAZE描述符,因为其他描述符在python的基础OpenCV库中没有提供。 下面是特征提取器的实现代码: import cv2 import numpy as np import scipy from scipy.misc import imread import cPickle as pickle import random import os import matplotlib.pyplot as plt # Feature extractor # 特征提取器 def extract_features(image_path, vector_size=32): image = imread(image_path, mode='RGB') try: # Using KAZE, cause SIFT, ORB and other was moved to additional module # which is adding addtional pain during install #此处为了简化安装步骤,使用KAZE,因为SIFT/ORB以及其他特征算子需要安 #装额外的模块

相关主题