opencv笔记(1)

OpenCV库分为多个模块:opencv_core模块包含库的核心功能,opencv_imgproc模块包含主要的图像处理函数,opencv_highgui模块提供了读写图像和视频的函数以及一些用户交互函数。函数

 

读取图像:

image=cv::imread("puppy.bmp");ui

if(image.empty()){spa

}指针

显示图像:视频

cv::nameWindow("Original Image");//定义窗口对象

cv::imshow("Original Image",image);事件

在OpenCV的C++API中,全部类和函数都在命名空间cv内定义。内存

 

 

回调函数:void onMouse(int event,int x,int y,int flags,void *param);

第一个参数是整数,表示触发回调函数的鼠标事件类型。后面两个参数是事件发生时鼠标的位置,用像素坐标表示。参数flag表示事件发生时按下了鼠标的哪一个按键,最后一个参数指向任意对象的指针,做为附加的参数发送给函数。回调函数

cv::setMouseCallback("original image",onMOuse,reinterpret_cast<void*>(&image));图像处理

 

Mat

Mat有两个必不可少的组成部分:头部和数据块。头部包含了矩阵的全部相关信息(大小/通道数量/数据类型)。数据块包含了图像的全部像素值。头部有一个指向数据块的指针,即data属性。

1/建立图像方法

cv:: Mat image1(240,320,  CV_8U,100);

cv::Mat image2(240,320,CV_8UC3,cv::Scalar(0,0,255));

2/能够随时用create方法分配或从新分配图像的数据块。若是图像已被分配,其原来的内容会被先释放。

image1.create(200,200,CV_8U);

一旦没有了指向Mat对象的引用,分配的内存就会被自动释放。两幅图像之间赋值,图像数据并不会被复制,此时两幅图像都指向同一个内存块。所以只有当图像的全部引用都被释放或赋值给另外一幅图像时,内存才会被释放。

3/图像深度复制方法:

image.copyTo(image2);

或者 image5=image3.clone();

定义感兴趣区域ROI

1/如何定义

定义了ROI以后,就能够把ROI当成一个普通的Mat实例进行操做。

A:cv::Rect。imageROI(image,cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));

经过指明左上角的位置和矩阵的尺寸(后两个参数是尺寸,前两个是坐标)。

B:还能够经过cv::(cv::Range(image.rows-logo.rows,image.rows),cv::Range(image.cols-logo.cols,image.cols));

注意:图像和ROI共享了同一块图像数据,所以ROI的任何转变都会影响原始图像的相关区域。在定义ROI时,数据并无复制,所以他的执行时间是固定的,不受ROI尺寸的影响。

C:要定义行组成的ROI:cv::Mat imageROI=image.rowRange(start,end);

cv::image.colRange(start,end);

掩码

掩码是一个8位图像,若是掩码中某个位置的值不为0,在这个位置的操做就会起做用。

imageROI=image(cv::Rect(image.cols-logo.cols,jimage.rows-logo.rows,logo.cols,logo.rows));

Mat mask(logo);

logo.copyTo(imageROI,mask);

相关文章
相关标签/搜索