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