学习opencv例2-3

合集下载

opencv 三阶贝塞尔曲线

opencv 三阶贝塞尔曲线

OpenCV三阶贝塞尔曲线1. 简介贝塞尔曲线是计算机图形学中常用的一种曲线表示方法,可以通过一系列控制点来描述曲线的形状。

OpenCV是一个功能强大的开源计算机视觉库,提供了丰富的图像处理和计算机视觉算法。

本文将介绍如何使用OpenCV实现三阶贝塞尔曲线。

2. 贝塞尔曲线概述贝塞尔曲线由一系列控制点和插值点构成。

控制点用于定义曲线的形状,而插值点则用于描述曲线的平滑程度。

贝塞尔曲线可以是一阶、二阶、三阶或更高阶的,本文将重点介绍三阶贝塞尔曲线。

三阶贝塞尔曲线由四个控制点P0、P1、P2和P3定义,其中P0和P3是曲线的起点和终点,P1和P2则用于控制曲线的形状。

曲线上的点可以通过参数t在[0, 1]范围内进行插值计算,公式如下:B(t) = (1-t)^3 * P0 + 3 * (1-t)^2 * t * P1 + 3 * (1-t) * t^2 * P2 + t^3 * P33. OpenCV实现使用OpenCV实现三阶贝塞尔曲线的步骤如下:3.1 导入库首先,需要导入OpenCV库。

import cv2import numpy as np3.2 创建画布创建一个空白画布,并设置画布的大小和背景色。

width, height = 800, 600canvas = np.zeros((height, width, 3), dtype=np.uint8)canvas.fill(255) # 设置背景色为白色3.3 定义控制点定义四个控制点的坐标,分别为P0、P1、P2和P3。

P0 = (100, 300)P1 = (200, 100)P2 = (600, 500)P3 = (700, 300)3.4 绘制控制点在画布上绘制四个控制点,可以使用OpenCV的cv2.circle()函数实现。

radius = 5color = (0, 0, 255) # 红色thickness = -1 # 填充cv2.circle(canvas, P0, radius, color, thickness)cv2.circle(canvas, P1, radius, color, thickness)cv2.circle(canvas, P2, radius, color, thickness)cv2.circle(canvas, P3, radius, color, thickness)3.5 计算并绘制曲线使用参数t在[0, 1]范围内进行插值计算,并在画布上绘制曲线。

python opencv案例

python opencv案例

Python是一种高级编程语言,它在计算机视觉领域有着广泛的应用。

OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。

Python和OpenCV的结合可以帮助开发者快速实现各种计算机视觉任务,比如图像处理、目标检测、人脸识别等。

本文将介绍几个基于Python和OpenCV的实际案例,以展示它们在计算机视觉领域的强大应用能力。

一、图像处理1. 图像读取与显示使用Python和OpenCV可以轻松地读取和显示图像。

通过简单的几行代码,可以实现图像的读取、显示和保存,让开发者能够快速上手。

2. 图像滤波图像滤波是图像处理中常用的技术,可以去除图像中的噪声,平滑图像,并提取图像的特征。

Python和OpenCV提供了多种滤波方法,比如均值滤波、高斯滤波、中值滤波等,可以根据实际需求选择最适合的方法。

3. 图像边缘检测通过Python和OpenCV,可以实现图像的边缘检测。

边缘检测可以帮助我们识别图像中的边界和轮廓,在目标检测、物体识别等领域有着重要的应用价值。

二、目标检测1. Haar特征分类器Haar特征分类器是一种常用的目标检测算法,可以用于检测人脸、眼睛、车辆等目标。

Python和OpenCV提供了训练和使用Haar特征分类器的工具,开发者可以根据自己的需求训练自己的分类器,实现目标检测任务。

2. 人脸识别人脸识别是计算机视觉领域的热门应用之一。

Python和OpenCV提供了各种人脸检测和识别的算法和工具,可以帮助我们实现人脸的检测、识别和跟踪。

三、图像拼接与全景图生成使用Python和OpenCV,可以将多张图片拼接成全景图。

通过图像特征的匹配和变换,可以实现图像的自动拼接,生成高质量的全景图像,具有很高的实用价值。

四、实时视瓶处理1. 视瓶捕获与显示Python和OpenCV提供了丰富的视瓶捕获和处理功能,可以从摄像头或视瓶文件中捕获视瓶帧并进行实时处理和显示。

2. 视瓶分析与目标跟踪通过Python和OpenCV,可以实现对视瓶流的分析和目标跟踪。

opencv库用法

opencv库用法

opencv库用法
OpenCV是计算机视觉中常用的专用库,支持多语言和跨平台操作。

其在Python中的使用方法如下:
1. 导入OpenCV模块:使用`import cv2`命令。

2. 加载图片:使用`cv2.imread()`函数读取图片。

参数为1时表示加载彩色图片,参数为0时表示加载黑白图片。

3. 查看图片形状和分辨率:使用`shape`子函数输出图片的形状。

4. 显示图片:使用`cv2.imshow()`函数显示图片,参数分别为图片名称和图片对象。

OpenCV还可以用于操作摄像头、调节参数和录制视频等操作。

如果你想要了解更多关于OpenCV的用法,可以查阅相关文档或搜索相关教程。

Opencv新手教程

Opencv新手教程

Opencv新手教程OpenCV是一个开源的计算机视觉库,用于处理图像和视频的各种任务。

它是一个强大的工具,可以应用于从简单的图像处理到复杂的计算机视觉任务。

在本教程中,我们将介绍一些基本的OpenCV功能和使用方法,以帮助你入门。

1. 安装OpenCV2. 导入OpenCV库在你的代码中,你需要导入OpenCV库。

你可以使用以下命令导入OpenCV库:import cv23.加载图像在OpenCV中,你可以使用imread(函数加载图像。

这个函数接受图像的文件路径作为参数,并返回一个代表图像的多维数组。

以下是一个加载图像的例子:image = cv2.imread('image.jpg')4.显示图像你可以使用imshow(函数显示图像。

这个函数接受两个参数,第一个参数是窗口的名称,第二个参数是要显示的图像。

以下是一个显示图像的例子:cv2.imshow('Image', image)cv2.waitKey(0)cv2.destroyAllWindows这个例子中,图像将在一个名为"Image"的窗口中显示。

你可以使用waitKey(函数等待用户的按键操作,然后使用destroyAllWindows(函数关闭窗口。

5.图像预处理OpenCV提供了许多图像预处理功能,如图像的调整、裁剪、旋转、缩放等。

你可以使用这些功能来改变图像的外观和大小。

以下是一些常用的图像预处理函数的例子:gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将图像转换为灰度图像resized_image = cv2.resize(image, (width, height)) # 调整图像大小cropped_image = image[y:y+h, x:x+w] # 裁剪图像rotated_image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) # 旋转图像这个例子中,我们将图像转换为灰度图像、调整大小、裁剪和旋转图像。

OPENCV学习笔记

OPENCV学习笔记

OPENCV学习笔记1、键盘响应事件While(1){If(cvWaitKey(100)==27)break;}括号里为延时等待ms等于的数值为ASCLL码(27)ESC建。

2、回调函数callback键盘响应回调函数参数事件位置需要注册回调函数到OPCV中,实现注册的函数是Cvsetmousecallback(){const char*window_name,Cvmousecallback on_mouseVoid param=null.}第一个参数指定了回调函数需要注册到的窗口即产生事件的窗口。

只有在这个指定窗口中发生的事件才会掉用这个函数。

第二个参数为回调函数。

最后,第三个参数用来传递额外的信息给前面的void*param3、OPENCV的基本数据类型Points size rectangles scalar三元结构Cvpoint int x y图像中的点Cvpoint2D32f float x,y二维空间中的点Cvpoint3D32F float x,y,z三维空间中的点Cvsize int width height图像的尺寸Cvrect int x y width height图像的部分区域Cvscalar double val[4]RGBA值假设要在(5,10)(20,30)间画一个白色矩形,只需要简单调用Cvrectangle(Myimg,Cvpoint(5,10)Cvpoint(20,30)Cvscalar(255,255,255)//RGB值全满为白色);3、使用OPENCV时会频繁遇到Iplimage数据类型IplImage是我们用来为通常所说的“图像”进行编码的基本结构。

这些图像可能是灰度,色彩,4通道的(RGB+alpha),其中的每个通道可以包含任意的整数或浮点数。

因此,该类型比常见的、易于理解的3通道8位RGB图像更通用。

Ipllmage由cvmat派生,cvmat由cvarr派生。

学习OpenCV(中文版)

学习OpenCV(中文版)

学习OpenCV(中⽂版)学习OpenCV(中⽂版)【原书名】 Learning OpenCV: Computer Vision with the OpenCV Library【原出版社】 O'Reilly Media, Inc.【作 者】(美)Gary Bradski;Adrian Kaehler【译 者】于仕琪;刘瑞祯[同译者作品]【丛书名】清华⼤学出版社O'Reilly系列【出版社】清华⼤学出版社【书号】 9787302209935【上架时间】 2009-10-16【出版⽇期】 2009 年10⽉【开本】 16开【页码】 601 【版次】1-1详情查看:【内容简介】计算机视觉是在图像处理的基础上发展起来的新兴学科。

OpenCV是⼀个开源的计算机视觉库,是英特尔公司资助的两⼤图像处理利器之⼀。

它为图像处理、模式识别、三维重建、物体跟踪、机器学习和线性代数提供了各种各样的算法。

.本书由OpenCV发起⼈所写,站在⼀线开发⼈员的⾓度⽤通俗易懂的语⾔解释了OpenCV的缘起和计算机视觉基础结构,演⽰了如何⽤OpenCV和现有的⾃由代码为各种各样的机器进⾏编程,这些都有助于读者迅速⼊门并渐⼊佳境,兴趣盎然地深⼊探索计算机视觉领域。

本书可作为信息处理、计算机、机器⼈、⼈⼯智能、遥感图像处理、认知神经科学等有关专业的⾼年级学⽣或研究⽣的教学⽤书,也可供相关领域的研究⼯作者参考。

透过本书,您将置⾝于迅速发展的计算机视觉领域。

本书由⾃由开源OpenCV的发起⼈所著,介绍了计算机视觉,并通过实例演⽰了如何快速⽣成这样的应⽤——能使计算机“看到”并根据由此获取的数据做出决策。

计算机视觉⽆处不在,安全系统、制造检验系统、医学图像分析、⽆⼈机等都可以见到它的踪影。

它与Google Map和Google Earth紧密结合,它检查LCD屏幕上的像素,它确保衬衫上的每个针脚都能完全缝合。

OpenCV提供了⼀个简易好⽤的计算机视觉框架和⼀个丰富的库,后者包含500多个可实时运⾏视觉代码的函数。

opencv入门与技术实践

opencv入门与技术实践OpenCV是一个开源的计算机视觉库,提供了用于图像处理和计算机视觉任务的各种函数和工具。

它可以用于从图像和视频中提取特征、检测对象、进行图像分割和增强等多种应用。

本文将介绍OpenCV的入门知识和一些技术实践。

一、OpenCV入门知识1. 安装OpenCV:首先需要下载OpenCV的安装包,并按照官方文档的指引进行安装。

安装完成后,可以在自己的代码中引入OpenCV库。

2. 图像读取与显示:使用OpenCV可以很方便地读取和显示图像。

通过cv2.imread()函数可以读取图像,并通过cv2.imshow()函数显示图像。

3. 图像操作:OpenCV提供了丰富的图像操作函数,例如图像的裁剪、缩放、旋转、镜像等。

这些函数可以帮助我们对图像进行各种处理。

4. 颜色空间转换:OpenCV支持常见的颜色空间转换,如RGB到灰度图像的转换、RGB到HSV的转换等。

通过cv2.cvtColor()函数可以实现不同颜色空间之间的转换。

5. 边缘检测:OpenCV提供了多种边缘检测算法,如Sobel算子、Canny算子等。

这些算法可以帮助我们找到图像中的边缘。

6. 特征提取与描述:OpenCV支持多种特征提取和描述算法,如SIFT、SURF、ORB等。

这些算法可以帮助我们在图像中提取出关键点和描述子,用于图像匹配和目标检测等任务。

二、OpenCV技术实践1. 目标检测:OpenCV可以用于目标检测任务。

通过训练一个分类器,可以检测图像中的特定对象。

常见的目标检测算法有Haar级联分类器和基于深度学习的算法。

2. 图像分割:OpenCV提供了多种图像分割算法,如基于阈值的分割、基于边缘的分割和基于聚类的分割等。

这些算法可以将图像分割成不同的区域,用于图像分析和目标提取等任务。

3. 图像增强:OpenCV可以对图像进行增强处理,如直方图均衡化、对比度增强、锐化等。

这些处理可以改善图像的质量和清晰度,使得图像更适合后续的分析和处理。

opencv笔记 二

异或操作bitwise_xor(变量,变量,输出变量)std::vector<Mat>mv;列:mv数组-mv[0],mv[1],mv[2],获取像素值split(image,mv)通道合并转换彩色图像merge(mv,输出变量)通道混合操作mixChannels(&image,&输出变量,1,数组名,数组里几对通道数)int 数组名[]={0,2,1,1,2,0}; 两两一对,共3对图像彩色空间转换-提取指定色彩区域inRange(变量图像名,Scalar(hsv最小值,hsv最小值,hsv最小值),Scalar(hsv最大值,hsv最大值,hsv最大值),输出变量)图像像素值统计求最小最大值minMaxLoc(image,&最小值变量,&最大值变量,&最小值的位置,&最大值的位置,Mat());Pointment 最小值的位置变量,最大值位置变量;图像像素值统计最小值min图像像素值统计最大值max图像像素值统计均值方差meanStdDev(image,变量1,变量2);图像像素值统计均值mean图像像素值统计标准方差standard deviation图像几何形状绘制绘制矩形Rect 等同于int 可以定义列:变量.x |y |width=100绘制矩形rectangle(image,Rect的变量,Scalar(0,0,255),大于等于0是线宽|小于0是填充,8,0)绘制圆形circle(image,Point(绘制的位置350,400),15是圆半径,Scalar(255,0,0),线宽和填充2,8,0)调节亮度addWeighted(image,0.7,Mat变量,0.3,0,变量输出dst)绘制线line(变量,Point(左上角坐标100,100),Point(右下角坐标350,400),Scalar(0,255,0),2,8或者LINE_AA反锯齿,0);绘制椭圆ellipse(image,rrt,Scalar(0,255,255),2,8);绘制椭圆-中心位置RotatedRect rrt;rrt.center=Point(200,200);绘制椭圆-大小弧度的高低rrt.Size(100,200)绘制椭圆-角度rrt.angle=0.0;随机数与随机颜色void drawing();//空函数Mat canvas=Mat::zeros(Size(512,512),CV_8UC3);int w=canvas.cols;int h=canvas.rows;RNG rng(12345);RNG 产生随机数while(true){ int c= waitKey(500);if(c==27){//退出break;}int x1=rng.uniform(0,w);int y1=rng.uniform(0,h);int x2=rng.uniform(0,w);int y2=rng.uniform(0,h);int b=rng.uniform(0,255);int g=rng.uniform(0,255);int r=rng.uniform(0,255);canvas=Scalar(0,0,0);//随机绘制一条线,不加上这个就是随机绘制多条线line(canvas,Point(x1,y1),Point(x2,y2),Scalar(b,g,r),1,LINE_AA,0);}多边形的填充与绘制Mat canvas=Mat::zeros(Size(512,512),CV_8UC3);Point p1(100,100);Point p2(350,100);std::vector<Point>pts;pts.push_back(p1);pts.push_back(p2);polylines(canvas,pts,true,Scalar(0,0,255),2,8,0);fillPoly(canvas,pts,Scalar(255,255,0)2,LINE_AA,0);//填充多边形一个API绘制多边形填充std::vector<std::vector<Point>>countours;contours.push_back(pts);drawContours(canvas,contours支持多个多边形,-1一次性绘制100个,Scalar(255,0,0),2填充); //-1一次性填充鼠标操作与响应Point sp(-1,-1);Point ep(-1,-1);Mat temp;static void on_draw(int event,int x,int y,int flas,void *userdata){Mat image=*((Mat*)userdata);if(event==EVENT_LBUTTONDOWN){sp.x=x;sp.y=y;std::cout<<"start point"<<sp<<std::endl;}else if(event==EVENT_LBUTTONUP){ep.x=x;ep.y=y;int dx=ep.x-sp.x;int dy=ep.y-sp.y;if(dx>0&&dy>0){Rect box(sp.x,sp.y,dx,dy);rectangle(image,box,Scalar(0,0,255),2,8,0);imshow("鼠标绘制",image);imshow("截取区域",image(box));sp.x=-1;sp.y=-1;}}else if(event==EVENT_MOUSEMOVE){if(sp.x>0&&sp.y>0){ep.x=x;ep.y=y;int dx=ep.x-sp.x;int dy=ep.y-sp.y;if(dx>0&&dy>0){Rect box(sp.x,sp.y,dx,dy);temp.copyTo(image);rectangle(image,box,Scalar(0,0,255),2,8,0);imshow("鼠标绘制",image);}}void QuickDemo::mouse_drawing_demo(Mat &image){ namedwindow("鼠标绘制",WINDOW_AUTOSIZE); setMouseCallback("鼠标绘制",on_draw,(void*)(&image)); imshow("鼠标绘制",image);temp=image.clone();}。

opencv笔记 三

图像像素类型转换与归一化Mat dst;std::cout<<image.type()<<std::endl;image.convertTo(dst,CV_32F);//变成每个通道32位,浮点数类型//原本CV_8UC3,每个通道8位std::cout<<dst.type()<<std::endl;normalize(image,dst,1.0,1,NORM_MINMAX);std::cout<<dst.type()<<std::endl;imshow("",std);图像放缩与差值Mat zoomin,zoomout;int h=image.rows;int w=image.cols;resize(image,zoomin,Size(w/2,h/2),0,0,INTER_LINEAR);imshow("zoomin"zoomin);resize(image,zoomout,Size(w*1.5,h*1.5),0,0,INTER_LINEAR);imshow("zoomout"zoomout);图像翻转Mat dst;filp(image,dst,0);//0是上下翻转,1是左右,-1是旋转180度imshow("图像翻转"dst);图像旋转Mat dst,M;int h=image.rows;int w=image.cols;M=getRotationMatrix2D(原来图像中心位置Point2f(w/2,h/2),旋转角度45,1.0); warpAffine(image,M,image,size(),INTER_LINEAR,0,Scalar(255,0,0));imshow("旋转演示“,dst);Mat dst,M;int h=image.rows;int w=image.cols;M=getRotationMatrix2D(原来图像中心位置Point2f(w/2,h/2),旋转角度45,1.0);double cos=abs(M.at<double>(0,0));double sin=abs(M.at<double>(0,1));int nw=cos*w+sin*h;int nh=sin*w+cos*h;M.at<double>(0,2)+=(nw/2-w/2);M.at<double>(1,2)+=(nh/2-h/2);warpAffine(image,M,image,size(nw,nh),INTER_LINEAR,0,Scalar(255,255,0));imshow("旋转演示“,dst);视频文件摄像头使用VideoCapture capture(0);//0是直接用的摄像头//"视频路径"Mat frame;while(true){capture.read(frame);flip(frame,frame,1);if(frame.empty()){break;}imshow("frame"frame);int c=waitKey(10);if(c==27){break;//退出}}视频处理与保存VideoCapture capture("视频路径");//0是直接用的摄像头//"视频路径"int frame_width=capture.get(CAP_PROP_FRAME_WIDTH);int frame_height=capture.get(CAP_PROP_FRAME_HEIGHT);int count=capture.get(CAP_PROP_FRAME_COUNT);int fps=capture.get(CAP_PROP_FPS);std;;cout<<""frame width"<<frame_width<<std::endl;std;;cout<<""frame width"<<frame_height<<std::endl;std;;cout<<""frame width"<<fps<<std::endl;std;;cout<<""frame width"<<cout<<std::endl;VideoWriterwriter("",capture.get(CAP_PROP_FOURCC),FPS,Size(frame_width,frame_height),ture); Mat frame;while(ture){capture.read(frame);flip(frame,frame,1);if(frame.empty()){break;}imshow("",frame);colorSpace_Demo(frame);writer.writer(frame);int c=waitKey(10);if(c==27){break;//退出}}capture.release();writer.release();}图像直方图std::vector<Mat>bgr_plane; //三通道分离split(image,bgr_plane);const int channels[1]={0}; //定义参数变量const int bins[1]={256};float hranges[2]={0,255};const float*ranges[1]={hranges};Mat b_hist;Mat g_hist;Mat r_hist;calcHist(&bgr_plane[0],1,0,Mat(),b_hist,1,bins,ranges); //计算通道的直方图calcHist(&bgr_plane[1],1,0,Mat(),g_hist,1,bins,ranges);calcHist(&bgr_plane[2],1,0,Mat(),r_hist,1,bins,ranges);int hist_w=512; //显示直方图int hist_h=400;int hist_w=cvRound((double)hist_w/bins[0]);Mat histImage=Mat::zeros(hist_h,hist_w,CV_8UC3);normalize(b_hist,b_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());//归一化直方图数据normalize(g_hist,g_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());normalize(r_hist,r_hist,0,histImage.rows,NORM_MINMAX,-1,Mat());for(int i=1;i<bins[0];i++){ //绘制直方图曲线line(histImage,Point(bin_w*(i-1),hist_h-cvRound(b_hist.at<float>(i-1)));Point(bin_w*(i),hist_h-cvRound(b_hist.at<float>(i))),Scalar(255,0,0),2,8,0);line(histImage,Point(bin_w*(i-1),hist_h-cvRound(g_hist.at<float>(i-1)));Point(bin_w*(i),hist_h-cvRound(g_hist.at<float>(i))),Scalar(0,255,0),2,8,0); line(histImage,Point(bin_w*(i-1),hist_h-cvRound(r_hist.at<float>(i-1))); Point(bin_w*(i),hist_h-cvRound(r_hist.at<float>(i))),Scalar(0,255,0),2,8,0); namedWindow("",WINDOW_AUTOSIZE);//显示直方图imshow("",hisImage);二维直方图Mat hsv,hs_hist;cvtColor(image,hsv,COLOR_BGR2HSV);int hbins=30,sbins=32;int hist_bins[]={hbins,sbins};float h_range[]={0,180};float s_range[]={0,256};const float*hs_ranges[]={h_range,s_range};int hs_channels[]={0,1};calcHist(&hsv,1,hs_channels,Mat(),hs_hist,2,hist_bins,hs_range,true,false); double maxVal=0;minMaxLoc(hs_hist,0,&maxVal,0,0);int scale=10;Mat hist2d_image=Mat::zeros(sbins*scale,hbins*scale,CV_8UC3);for(int h=0;h<hbins;h++){for(int s=0;s<sbins;s++){float binVal=hs_hist.at<float>(h,s);int intensity=cvRound(binVal*255/maxVal);rectangle(hist2d_image,Point(h*scale,s*scale);Point(h+1)*scale-1,(s+1)*scale-1),Scalar::all(intensity),-1);}}applyColorMap(hist2d_image,hist2d_image,COLORMAP_IET);imshow("H-S Histogram",hist2d_image);imshow("D:/hist_2d.png",hist2d_image);直方图均衡化Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);imshow("灰图",gray);Mat dst;equalizeHist(gray,dst);imshow("均衡化演示",dst);图像卷积操作Mat dst;blur(image,dst,Size(15,1),Point(-1,-1));imshow("图像模糊",dst);高斯模糊Mat dst;GaussianBlur(image,dst,Size(15,1),15);imshow("图像模糊",dst);高斯双边模糊Mat dst;bilateralFilter(image,dst,0,100,10);imshow("双边模糊",dst);图像像素类型转换与归一化。

OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

OpenCV计算机视觉学习(3)——图像灰度线性变换与⾮线性变换(对数变换,伽马变换)如果需要处理的原图及代码,请移步⼩编的GitHub地址 传送门: 下⾯主要学习图像灰度化的知识,结合OpenCV调⽤ cv2.cvtColor()函数实现图像灰度化,使⽤像素处理⽅法对图像进⾏灰度化处理。

1. 图像灰度化1.1 图像灰度化的⽬的 将彩⾊图像转化为灰度图像的过程是图像的灰度化过程。

彩⾊图像中的每个像素的颜⾊由 R, G, B三个分量决定,⽽每个分量中可以取值 0~255,这样⼀个像素点可以有 1600多万(255*255*255=16581375)的颜⾊的变化范围。

⽽灰度图像是 R,G,B三个分量相同的⼀种特殊的彩⾊图像,其中⼀个像素点的变换范围为 256 种,所以在数字图像处理中⼀般将各种格式的图像转换为灰度图像以使后续的图像计算量少⼀些。

灰度图像的描述与彩⾊图像⼀样仍然反映了整幅图像的整体和局部的⾊度和⾼亮等级的分布和特征。

1.2 图像灰度化原理 图像灰度化是将⼀幅彩⾊图像转换为灰度化图像的过程。

彩⾊图像通常包括R、G、B三个分量,分别显⽰出红绿蓝等各种颜⾊,灰度化就是使彩⾊图像的R、G、B三个分量相等的过程。

灰度图像中每个像素仅具有⼀种样本颜⾊,其灰度是位于⿊⾊与⽩⾊之间的多级⾊彩深度,灰度值⼤的像素点⽐较亮,反之⽐较暗,像素值最⼤为255(表⽰⽩⾊),像素值最⼩为0(表⽰⿊⾊)。

图像灰度化核⼼思想是 R = G = B ,这个值也叫灰度值。

上表中Gray表⽰灰度处理之后的颜⾊,然后将原始RGB(R,G,B)颜⾊均匀地替换成新颜⾊RGB(Gray,Gray,Gray),从⽽将彩⾊图⽚转化为灰度图像。

⼀种常见的⽅法是加权平均灰度处理,这种效果是最好的。

是将RGB三个分量求和再取平均值,但更为准确的⽅法是设置不同的权重,将RGB分量按不同的⽐例进⾏灰度划分。

⽐如⼈类的眼睛感官蓝⾊的敏感度最低,敏感最⾼的是绿⾊,因此将RGB按照0.299、0.587、0.114⽐例加权平均能得到较合理的灰度图像,如公式所⽰:1.3 图像灰度化的三种⽅法1.3.1 OpenCV直接灰度化 下⾯的这种⽅法,在读取图⽚的时候,直接将图⽚转化为灰度化:import cv2img = cv2.imread(photo_file, cv2.IMREAD_GRAYSCALE) 得到的img是⼀个函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

视频播放控制 学习opencv书上例2-3,最好留了一个思考问题:实现滚动条随着视频播放自动移动。

笔者也是在原来书上写的程序的基础上稍作修改,现将代码写出来供大家参考!

#include "cv.h" #include "highgui.h" #include using namespace std;

int g_slider_position=0; //滚动条的位置 CvCapture* g_capture=NULL;

void onTrackbarSlide(int pos) { cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);

} /*回调函数,当滚动条被拖动时就调用它。滚动条的位置会被作为参数形式传给回调函数,回调函数的作用就是从当前滚动条的位置显示帧*/

int main(int argc,char** argv) { cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); g_capture=cvCreateFileCapture(argv[1]); int frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);

/*获得总帧数,也就是滚动条位置的最大值,这个函数的功能和第二个参数有关。*/ if(frames!=0) { cvCreateTrackbar("position","Example3",&g_slider_position,frames,onTrackbarSlide);/*当滚动条被拖动时,opencv会自动将当前位置所代表的值传个指 针所指向的整数,也就是说当滚动条被拖动时, g_slider_position的值是在改变的*/

} /*如果此处滚动条没有被拖动,此语句的作用就是在窗口上创建了一个滚动条,其位置为0,即在初始位置。*/

IplImage* frame; //while loop (as in Example2) caprpture & show video int n=g_slider_position; while(1) {

frame=cvQueryFrame(g_capture); if(!frame) break; cvShowImage("Example3",frame); cvCreateTrackbar("position","Example3",&n,frames,onTrackbarSlide);/*每次循环都在当前位置重新创造一个滚动条,也就是滚动条随着视频播放自动移动*/

char c=cvWaitKey(33); if(c==27) break; n++;

}

cvReleaseCapture(&g_capture); cvDestroyWindow("Example3"); }  例2-3学习笔记 cvCreateTrackbar 该函数为开放计算机视觉(OpenCV)库库函数,创建trackbar并将它添加到指定的窗口。 定义: CV_EXTERN_C_FUNCPTR( void (*CvTrackbarCallback)(int pos) ); 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默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos来重新设置trackbar的显示位置。

int cvCreateTrackbar( const char* trackbar_name, //滑动条的名称 const char* window_name, //窗口的名称,滑动条不会遮挡图像 int* value, //当滑动条被拖到时,OpenCV会自动将当前位置所代表的值传给指针指向的整数 int count, //滑动条所能达到的最大值 CvTrackbarCallback on_change //可选的回调函数,回调函数可参见

其中openCV的highgui库提供了两个函数来读取和设置滚动条的value值 //读取value值 int cvGetTrackbarPos( const char* trackbar_name, cosnt char* window_name );

//设置value值 void cvSetTrackbarPos( const char* trackbar_name, const char* window_name, int pos );

OpenCV中关于cvGetCaptureProperty函数

OpenCV中提供了一个函数cvGetCaptureProperty(Capture* cap,int property_index)函数来获取视频文件的一些属性,这是其中的OpenCV中属性的一些宏定义: #define CV_CAP_PROP_POS_MSEC 0 #define CV_CAP_PROP_POS_FRAMES 1 #define CV_CAP_PROP_POS_AVI_RATIO 2 #define CV_CAP_PROP_FRAME_WIDTH 3 #define CV_CAP_PROP_FRAME_HEIGHT 4 #define CV_CAP_PROP_FPS 5 #define CV_CAP_PROP_FOURCC 6 #define CV_CAP_PROP_FRAME_COUNT 7 #define CV_CAP_PROP_FORMAT 8 #define CV_CAP_PROP_MODE 9 #define CV_CAP_PROP_BRIGHTNESS 10 #define CV_CAP_PROP_CONTRAST 11 #define CV_CAP_PROP_SATURATION 12 #define CV_CAP_PROP_HUE 13 #define CV_CAP_PROP_GAIN 14 #define CV_CAP_PROP_EXPOSURE 15 #define CV_CAP_PROP_CONVERT_RGB 16 #define CV_CAP_PROP_WHITE_BALANCE 17 #define CV_CAP_PROP_RECTIFICATION 18

通过创建一个Capture对象的指针后,调用cvGetCaptureProperty即可获取上述任何相关属性;但是我们不能太依赖这个函数;比如我们想获取一段视频的帧数,我们就不能太依赖于CV_CAP_PROP_FRAME_COUNT这个属性;因为cvGetCaptureProperty对属性的访问,其实访问的是关联视频文件的文件头信息,并不是真正去访问了视频的图像数据,这就带来一个问题:我们在讲其他视频格式转换为AVI格式的时候,图像帧数并没改变,只是视频文件头改变了,这时直接通过get函数读取的信息就可能不准确;最好的办法是迭代从视频中取出一帧,检查是否有数据,来确定该视频文件的总共帧数~~~ 不光是帧数,帧率也可能不对~~ 比如,自己在实验中庸狸窝转换器将一段视频转换为avi格式的视频文件后,用下面的两段代码,结果差距很大:

code 1.

CvCapture *cap = cvCaptureFromFile(videoName);//获取视频 int numFrames = (int) cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);//得到视频帧数,笔者获得的结果为148

CODE 2. IplImage* pImg=NULL; int count=0; while((pImg=cvQueryFrame(cap))!=NULL) { count++;

}//得到的帧数只有60帧;

究其原因其实就是cvGetCaptureProperty实现的机制上,它只是读取视频文件头信

息,而不是真正读取了视频文件;因此在进行不同格式的视频文件转换为OpenCV支持的AVI时,可能获取的属性并不准确~~~ 因此在使用该函数时,要注意。自己的经验是对于原始的AVI文件,可以直接使用该函数(code1),而经过转换而得到的视频文件,最好使用code 2。

cvSetCaptureProperty 设置视频获取属性 int cvSetCaptureProperty( CvCapture* capture, int property_id, double value ); capture 视频获取结构。 property_id 属性标识符。可以是下面之一: CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒 CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效) CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾) CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效) CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效) CV_CAP_PROP_FPS - 帧率(只对摄像头有效) CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)value 属性的值。 函数cvSetCaptureProperty设置指定视频获取的属性。目前这个函数对视频文件只支持: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO

相关文档
最新文档