opencv学习笔记(一)cv::mat

下面的程序用来测试cv::Mat数据结构的不同属性:

#include
#include
#include
//测试函数创建一个图像
cv::Mat function(){
//创建图像
cv::Mat ima(500,500,CV_8U,50);
//返回图像
return ima;
}
int main(){
//定义图像窗口
cv::namedWindow("Image 1");
cv::namedWindow("Image 2");
cv::namedWindow("Image 3");
cv::namedWindow("Image 4");
cv::namedWindow("Image 5");
cv::namedWindow("Image");
//创建一个240*320的新图像1
cv::Mat image1(240,320,CV_8U,100);
//显示图像1
cv::imshow("Image",image1);
//等待按键
cv::waitKey(0);
//重新分配一个新的图像200*200
image1.create(200,200,CV_8U);
image1=200;
//显示图像1
cv::imshow("Image",image1);
//0为无限等待下去
cv::waitKey(0);
//创建一个红色的图像
//通道次序为BGR
cv::Mat image2(240,320,CV_8UC3,cv::Scalar(0,0,255));
//另一种写法
//cv::Mat image2(cv::Size(320,240),CV_8UC3);
//image2=cv::Scalar(0,0,255);

//显示图像2
cv::imshow("Image",image2);
cv::waitKey(0);

//读入一个图像,注:此处为示例图像,请自行插入图片路径
cv::Mat image3=cv::imread("/home/joe/projects/op1/1.jpg");
//所有这些图像指向同一个数据块,即为读入图片
cv::Mat image4(image3);
image1=image3;
//所有的图像为原图像的副本图像
image3.copyTo(image2);
cv::Mat image5=image3.clone();
//转换图像用来测试-----------------------------------------------------
cv::flip(image3,image3,1);
//检查哪些图像在处理过程中受到影响
cv::imshow("Image 3",image3);
cv::imshow("Image 1",image1);
cv::imshow("Image 2",image2);
cv::imshow("Image 4",image4);
cv::imshow("Image 5",image5);
cv::waitKey(0);
//从函数中获取一个灰度图像
cv::Mat gray=function();
cv::imshow("Image",gray);
cv::waitKey(0);
//作为灰度图像写入
image1=cv::imread("/home/joe/projects/op1/1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
image1.convertTo(image2,CV_32F,1/255.0,0.0);
cv::imshow("Image",image2);
cv::waitKey(0);
return 0;
}

以上程序可以直接运行,亲测可行,如果是Ubuntu系统下的Kdevelop,提供以下Cmakelist.txt

#这是对CMake工具最低版本要求,这里我们要检查下我们的CMake工具的版本信息,我们可以使用命令“cmake --version”查看
cmake_minimum_required(VERSION 2.6)
project(test)#这是建立一个工程项目,括号里面时工程名,工程名我们可以任意给,最后程序编译出来的可执行文件就是这个名字
FIND_PACKAGE(OpenCV  REQUIRED )#用Cmake查找opencv包
set(CMAKE_CXX_STANDARD 11)#用C++11标准库编译
set(SOURCE_FILES main.cpp)
add_executable(test ${SOURCE_FILES})#这里括号里面的两个参数分别是工程项目名和我们要编译文件名的意思,记住中间一空格键隔开
TARGET_LINK_LIBRARIES(test ${OpenCV_LIBS})#这是我们链接到OpenCV库的环节,我们只要更改前面第一个参数位我们的工程项目名即可

运行即可得到需要的五张图片,以及测试用的若干张图片。

总结:cv::Mat 包含头部和数据块,头部有一个指向数据库的指针,所以可以实现多个对象同时指向同一个数据块。例子如下:

cv::Mat image1(240,320,CV_8U,100);创建一个240行*320列的新图像,CV_8U用来表示每个像素对应1字节,用字母U表示无符号;S表示有符号。对于彩色图像用三通道(CV_8UC3),也可以定义16位和32位的整数(CV_16SC3)。opencv中有一个简单的数据结构cv::Scalar用法

// 创建一个红色图像
// 通道次序是BGR
cv::Mat image2(240,320,CV_8UC3,cv::Scalar(0,0,255));

关于我在程序中标出的cv::Mat gray=function();运行这条语句后,我们就可以用变量gray操作这个由function函数创建的图像,而不需要额外分配内存。由cv::Mat实例到图像gray,只是进行了一次浅复制,局部变量ima超出作用范围之后,ima会被释放,gray引用了ima内部的图像数据,因此ima的内存块不会被释放。

关于cv::Mat 以上

初学opencv,慢慢走。

你可能感兴趣的:(opencv)