1、opencv2opencv.hpp#include using namespace cv;using namespace std;int main() cout hello opencv opencv2/imgcodecs.hppopencv2/highgui.hppstring namespaceint main(int argc, char* argv) /! load String imageName(cute.jpg / by default if (argc 1) imageName = argv1; mat Mat image; imread image = imread(imag
2、eName, IMREAD_COLOR); / Read the file if (image.empty() / Check for invalid inputCould not open or find the image std:endl; return -1; window namedWindow(Display window, WINDOW_AUTOSIZE); / Create a window for display. imshow imshow(, image); / Show our image inside it. wait waitKey(0); / Wait for a
3、 keystroke in the window二 Mat,图像的新容器基础知识自从版本2.0,OpenCV采用了新的数据结构,用Mat类结构取代了之前用extended C写的cvMat和lplImage,更加好用啦,最大的好处就是更加方便的进行内存管理,对写更大的程序是很好的消息。int main(int argc,char *argv) /声明类 image = imread(, IMREAD_COLOR); if (!image.data) / Check for invalid input Mat gray_image; cvtColor(image, gray_image, CV_
4、BGR2GRAY); /将彩色图像变为灰度图像 imwrite(Gray_Image.jpg, gray_image); /write pictureColor image, CV_WINDOW_AUTOSIZE);Gray image /原图 /灰色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 (allocate matrix)3 Mat B(A);
5、/ 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);M = endl M MatMat I;IplImage* pI = &I.operator IplImage();CvMat* mI = &I.operator CvMat();5. 改变矩阵creat()函数 不能用来初始化一个矩阵,它不是构造函数,它用来改变一个已有的矩阵的格式
6、。Create() function:M.create(4,4, CV_8UC(2);cout 6. Matlab类型初始化操作Mat E = Mat:eye(4, 4, CV_64F);E = E Mat O = Mat:ones(2, 2, CV_32F);O = O Mat Z = Mat:zeros(3,3, CV_8UC1);Z = Z 三 图像处理的基本操作Opencv图像处理基本操作1基本数据类型图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使用img.channels()获
7、取图像通道个数。使用若干个位存储一副图像的每个像素,这被称为图像的深度,灰度图像为8位,即0-255个灰度级,可以用img.depth()获得图像的深度,其返回值为:CV_8U - 8-bit unsigned integers ( 0.255 ) CV_8S - 8-bit signed integers ( -128.127 ) CV_16U - 16-bit unsigned integers ( 0.65535 ) CV_16S - 16-bit signed integers ( -32768.32767 ) CV_32S - 32-bit signed integers ( -21
8、47483648.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 )对于灰度图像和彩色图像,最常见的是CV_8U.Mat img=imread(lena.png,IMREAD_GRAYSCALE);Mat fp;img.convertTo(fp,CV_32F);/改变图像的深度1232 像素级访问1. 第一种方法:模板函数atuchar pix
9、el=img.at(0,0); /获得灰度图像0,0点像素Vec3b pixel=img.at /获得3波段图像的第一个波段(0,0)像素。第一种方法,效率不高,必须定位到他所在的位置2. 第二种方法:函数ptr他返回图像特定行的指针。因此可以得到每一行的数据,时间复杂度降低, 如下代码获取一副彩色图像的每个像素值。/时间复杂度大大降低!uchar R,G,B;for (int i=0;iimg.rows;i+) /遍历行 Vec3b pixRow=img.ptr(i);for (int j=0;j input; / We use the alpha provided by the user
10、if it is between 0 and 1 if (input = 0.0 & input = 1.0) alpha = input; / Read image ( same size, same type ) src1 = imread(LinuxLogo.jpg src2 = imread(WindowsLogo.jpgsrc1.data) printf(Error loading src1 nsrc2.data) printf(Error loading src2 n / Create WindowsLinear Blend beta = (1.0 - alpha); addWei
11、ghted(src1, alpha, src2, beta, 0.0, dst);, dst);当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. 获得一个图片的像素我们用image.at(y,x)c 这里的y为行,x为列,c代表R, G or B (0,
12、1 or 2) double alpha; /* Simple contrast control */ int beta; Simple brightness control */ / Read image given by user Mat image = imread( Mat new_image = Mat:zeros(image.size(), image.type(); /copy the origin picture size,and type / Initialize values Basic Linear Transforms -* Enter the alpha value
13、1.0-3.0: alpha;* Enter the beta value 0-100: 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)c = saturate_cast(alpha*(image.at(y, x)c) + beta);/saturate_cast to make sure
14、the values are valid.Original ImageNew Image, new_image); waitKey();示例如下:可以看到改变的图片的对比度和亮度。这里可以用函数image.convertTo(new_image, -1, 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, Si
15、ze axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 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),
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