ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:1.59MB ,
资源ID:4309843      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4309843.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Opencv学习笔记一.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Opencv学习笔记一.docx

1、Opencv学习笔记一Opencv学习笔记(一)一 VS2015-openCV3.1.0-win10 配置说明注意本文是针对vs2015的,因为vs2015为vc14在以前的opencv中没有vc14,因此带来了很多的不便,本文对VS2015-openCV3.1.0配置进行说明。1 安装vs,opencvvs2015安装与opencv3.1.0安装过程不予讲述。2 OpenCV3.1.0环境变量配置右键属性-高级系统设置-环境变量-系统变量-找到Path-在变量值中添加相应路径,我的路径是 H:Opencv3.1.0opencvbuildx64vc14bin3 VS中配置: 首先建立一个Win

2、32控制台项目,然后选择空项目: 先在源文件下建立一个.cpp源文件 命名为main.cpp :然后点击视图,在视图下找到其他窗口,在其他窗口下找到属性管理器,点击打开,.然后便会有一个属性管理器的窗口了,接下来点开工程文件test,下边会有一个Debug|x64的文件夹,点开,下有名为Microsoft.Cpp.x64.user的文件,右键属性然后选择通用属性下的VC+目录,右边会有包含目录和库目录,点击包含目录,添加以下三条路径,其实这些都是刚才OpenCV相关解压文件所在的目录H:Opencv3.1.0opencvbuildinclude H:Opencv3.1.0opencvbuild

3、includeopencv H:Opencv3.1.0opencvbuildincludeopencv2 这三条路径要依据自己解压OpenCV3.1的路径进行修改 :再点击库目录添加下面一条路径 C:Opencv3.1.0opencvbuildx64vc14lib 还是刚才的属性页面 点击链接器,选择输入,会在右侧看到附加依赖项,添加下面文件 opencv_world310d.lib4 测试#include#include using namespace cv;using namespace std;int main() cout hello opencv endl; IplImage *pl

4、mg = cvLoadImage(lena.jpg, 1); /声明IplImage指针 cvNamedWindow(Image, 1); /创建窗口 cvShowImage(Image, plmg); /显示图像 cvWaitKey(0); /等待按键 如果没有这句,显示图片的那句就会一闪而过 立刻销毁了 cvDestroyWindow(Image); cvReleaseImage(&plmg); return 0;注意:1.这里用的是 debug x64版本,要将vs中 x86改成x64 2.图片放在项目的Debug下。 这里给出最新的opencv 读图的方法/! includes#inc

5、lude #include #include #include #include /! includes/! namespaceusing namespace cv;/! namespaceusing namespace std;int main(int argc, char* argv) /! load String imageName(cute.jpg); / by default if (argc 1) imageName = argv1; /! load /! mat Mat image; /! mat /! imread image = imread(imageName, IMREA

6、D_COLOR); / Read the file /! imread if (image.empty() / Check for invalid input cout Could not open or find the image std:endl; return -1; /! window namedWindow(Display window, WINDOW_AUTOSIZE); / Create a window for display. /! window /! imshow imshow(Display window, image); / Show our image inside

7、 it. /! imshow /! wait waitKey(0); / Wait for a keystroke in the window /! wait return 0;二 Mat,图像的新容器基础知识自从版本2.0,OpenCV采用了新的数据结构,用Mat类结构取代了之前用extended C写的cvMat和lplImage,更加好用啦,最大的好处就是更加方便的进行内存管理,对写更大的程序是很好的消息。#include#include using namespace cv;using namespace std;int main(int argc,char *argv) Mat im

8、age; /声明类 image = imread(lena.jpg, IMREAD_COLOR); if (!image.data) / Check for invalid input cout Could not open or find the image std:endl; return -1; Mat gray_image; cvtColor(image, gray_image, CV_BGR2GRAY); /将彩色图像变为灰度图像 imwrite(Gray_Image.jpg, gray_image); /write picture namedWindow(Color image,

9、CV_WINDOW_AUTOSIZE); namedWindow(Gray image, CV_WINDOW_AUTOSIZE); imshow(Color image, image); /原图 imshow(Gray image, gray_image); /灰色 waitKey(0); return 0;Mat解析1. Mat是一个类,有构造函数,赋值函数等1 Mat A, C; / creates just the header parts2 A = imread(argv1, CV_LOAD_IMAGE_COLOR); / here well know the method used

10、(allocate matrix)3 Mat B(A); / Use the copy constructor4 C = A; / Assignment operator2. 如果要拷贝自己的矩阵:1 Mat F = A.clone();2 Mat G;3 A.copyTo(G);3. 构造函数解析 Mat M(2,2, CV_8UC3, Scalar(0,0,255); cout M = endl M endl MatMat I; IplImage* pI = &I.operator IplImage(); CvMat* mI = &I.operator CvMat(); 5. 改变矩阵cr

11、eat()函数 不能用来初始化一个矩阵,它不是构造函数,它用来改变一个已有的矩阵的格式。Create() function:M.create(4,4, CV_8UC(2);cout M = endl M endl endl;6. Matlab类型初始化操作Mat E = Mat:eye(4, 4, CV_64F);cout E = endl E endl endl;Mat O = Mat:ones(2, 2, CV_32F);cout O = endl O endl endl;Mat Z = Mat:zeros(3,3, CV_8UC1);cout Z = endl Z endl endl;三

12、 图像处理的基本操作Opencv图像处理基本操作1基本数据类型图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使用img.channels()获取图像通道个数。使用若干个位存储一副图像的每个像素,这被称为图像的深度,灰度图像为8位,即0-255个灰度级,可以用img.depth()获得图像的深度,其返回值为:CV_8U - 8-bit unsigned integers ( 0.255 ) CV_8S - 8-bit signed integers ( -128.127 ) CV_16U -

13、 16-bit unsigned integers ( 0.65535 ) CV_16S - 16-bit signed integers ( -32768.32767 ) CV_32S - 32-bit signed integers ( -2147483648.2147483647 ) CV_32F - 32-bit floating-point numbers ( -FLT_MAX.FLT_MAX, INF, NAN ) CV_64F - 64-bit floating-point numbers ( -DBL_MAX.DBL_MAX, INF, NAN )对于灰度图像和彩色图像,最常见

14、的是CV_8U.Mat img=imread(lena.png,IMREAD_GRAYSCALE);Mat fp;img.convertTo(fp,CV_32F);/改变图像的深度1232 像素级访问1. 第一种方法:模板函数atuchar pixel=img.at(0,0); /获得灰度图像0,0点像素Vec3b pixel=img.at(0,0); /获得3波段图像的第一个波段(0,0)像素。12第一种方法,效率不高,必须定位到他所在的位置2. 第二种方法:函数ptr他返回图像特定行的指针。因此可以得到每一行的数据,时间复杂度降低, 如下代码获取一副彩色图像的每个像素值。/时间复杂度大大降

15、低!uchar R,G,B;for (int i=0;iimg.rows;i+) /遍历行 Vec3b pixRow=img.ptr(i);for (int j=0;jimg.cols;j+) /遍历*列* B=pixRowj0; G=pixRowj1; R=pixRowj2;测量程序用时可用函数:double to=(double)getTickCount(); elapsed=(double)getTickCount()-to)/getTickFrenquency()图像位运算可以用掩码对一个图像进行处理,位元算有:void bitwise_and(InputArray src1, Inp

16、utArray src2, OutputArray dst, InputArray mask=noArray() 其中src1是原始的图像,src2是掩码,dst为输出一个例子:#include#include using namespace cv;using namespace std;int main() Mat img = imread(cute.jpg, 1); if (img.empty() cout cannot load image endl; imshow(Origin, img); Mat mask(img.rows, img.cols,CV_8UC3, Scalar(0,

17、0,0 ); circle(mask, Point(img.rows / 2, img.cols / 2-35), 220,Scalar(255,255,255),-1); /画一个圆 imshow(Mask, mask); /执行位操作 Mat r; bitwise_and(img, mask, r); imshow(Bit_and, r); waitKey(0); return 0;如下所示的图像处理过程: 分别为原始图像,掩模,计算后的图像1. Adding (blending) two images using OpenCV将两张图像以线性组合的方式合并成一张图像,注意的是,两张图像的

18、大小应该相同。 g(x) = (1 -a)*f0(x) + a*f1(x)g(x)为生成的矩阵,f0(x),f1(x)为要合并的两个矩阵。a为尺度。用到的函数原型: C+: void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)#include #include #include #include #include using namespace cv;using namespace std;int mai

19、n(int argc, char* argv) double alpha = 0.5; double beta; double input; Mat src1, src2, dst; / Ask the user enter alpha std:cout Simple Linear Blender std:endl; std:cout - std:endl; std:cout input; / We use the alpha provided by the user if it is between 0 and 1 if (input = 0.0 & input = 1.0) alpha =

20、 input; / Read image ( same size, same type ) src1 = imread(LinuxLogo.jpg); src2 = imread(WindowsLogo.jpg); if (!src1.data) printf(Error loading src1 n); return -1; if (!src2.data) printf(Error loading src2 n); return -1; / Create Windows namedWindow(Linear Blend, 1); beta = (1.0 - alpha); addWeight

21、ed(src1, alpha, src2, beta, 0.0, dst); imshow(Linear Blend, dst); waitKey(0); return 0;当a=0时,此时只有window的logo2. Changing the contrast and brightness of an image改变图像的对比度和亮度 基础的公式为: g(i; j) = a*f(i,j) + b where i and j indicates that the pixel is located in the i-th row and j-th column. 获得一个图片的像素我们用ima

22、ge.at(y,x)c 这里的y为行,x为列,c代表R, G or B (0, 1 or 2)int main(int argc, char* argv) double alpha; /* Simple contrast control */ int beta; /* Simple brightness control */ / Read image given by user Mat image = imread(cute.jpg); Mat new_image = Mat:zeros(image.size(), image.type(); /copy the origin picture

23、size,and type / Initialize values std:cout Basic Linear Transforms std:endl; std:cout - std:endl; std:cout alpha; std:cout beta; / Do the operation new_image(i,j) = alpha*image(i,j) + beta for (int y = 0; y image.rows; y+) for (int x = 0; x image.cols; x+) for (int c = 0; c 3; c+) new_image.at(y, x)

24、c = saturate_cast(alpha*(image.at(y, x)c) + beta);/saturate_cast to make sure the values are valid. namedWindow(Original Image, 1); namedWindow(New Image, 1); imshow(Original Image, image); imshow(New Image, new_image); waitKey(); return 0;示例如下:可以看到改变的图片的对比度和亮度。这里可以用函数image.convertTo(new_image, -1,

25、alpha, beta);来代替for循环,它会更有效率。Basic Drawing1. 定义一个点 2DPoint pt;pt.x = 10;pt.y = 8;Point pt = Point(10, 8);2. 画椭圆ellipse原型 void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1, int lineType = LINE_8, int sh

26、ift = 0);后面三个为默认的参数,可以不写。/自己写的函数,指定img,和角度void MyEllipse(Mat img, double angle) int thickness = 2; int lineType = 8; ellipse(img, Point(w / 2, w / 2), Size(w / 4, w / 16), angle, 0, 360, Scalar(255, 0, 0), /为颜色 thickness, lineType);/*调用方法:*MyLine(rook_image, Point(0, 15 * w / 16), Point(w, 15 * w / 16);3. 画线段函数原型 void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);Random generator and text with OpenCV随机数产生类Ran

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1