opencv学习笔记opencv加载图像修改图像显示图像保存图像以及代码举例

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习笔记opencv加载图像修改图像显示图像保存图像以及代码举例相关的知识,希望对你有一定的参考价值。

从今天开始陆续写计算机视觉中的开源库opencv的内容,首先开始学习一下opencv对图像的基本操作:加载图像、修改图像、显示图像以及保存图像,最后展示一段代码示例,让我们对它们有一个整体的了解。

1. 加载图像cv::imread

加载图像就是把存储在设备上的图像输出到Mat格式的数据结构上。

Mat imread(const String& filename,int flags = 1);
  • filename表示待加载的图像。
  • flags有两种解释,如下:

解释1:int类型

//    1.flag <0) 返回一个3通道的彩色图像
//    2.flag =  0灰度图像
//    3.flag >0 包含Alpha图像的加载图像

解释2:enum类型

enum
{
	CV_LOAD_IMAGE_UNCHANGED = -1,//已经被弃用
	CV_LOAD_IMAGE_GRAYSCALE = 0,//8 bit,灰度图
	CV_LOAD_IMAGE_COLOR = 2,//转换到彩色图
	CV_LOAD_IMAGE_ANYDEPTH = 2,//任何深度图像
	CV_LOAD_IMAGE_ANYCOLOR = 4//任意颜色
};

默认为加载原图,也就是彩色图像。例如:

Mat src = imread("D:/image/lena.bmp");

2. 图像的显示cv::imshow

imshow用于在指定的窗口中显示一副图像,函数原型如下:

imshow 	( const String & winname, InputArray mat ) 	
  • winname表示窗口的名称
  • mat表示待显示的图像

如果窗口是用CV_ WINDOW_AUTOSIZE(默认值)标志创建的,那么显示原图像,否则将根据图像的深度进行缩放,例如:

  • 载入的图像是8位无符号类型(8-bit unsigned),则显示图像本来的样子。
  • 如果是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。
  • 如果图像是32位浮点型(32-bit floating-point),像素值便要乘以255。

3. 创建窗口cv::namedWindow

namedWindow函数用于创建一个窗口,它是由OpenCV自动创建与释放,你无需去销毁它。如果只是简单地进行图片显示,可以略去namedWindow函数的调用。

但是如果在显示窗口之前就用到窗口名,比如滑动条的使用,要指定滑动条依附到某个窗口上,就需要nameWindow函数先创建窗口了。它的原型如下:

void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
  • winname表示窗口的名称
  • flags表示窗口的标识,它有如下几种类型。
//    1.WINDOW_AUTOSIZE:会自动根据图像大小,显示窗口大小,不能人为改变窗口大小 
//    2.WINDOW_NORMAL:用户可以改变窗口大小。
//    3. WINDOW_OPENGL:支持opengl

4. 保存图像cv::imwrite

保存图像的原型如下:

bool cv::imwrite(const String & filename,InputArray img,const std::vector<int> & params = td::vector< int >()) 	
  • filename表示文件名,如123.jpg
  • img待保存的数据,Mat格式的图像数据。
  • params特定格式保存,它有如下需要注意的地方:
  • 对于JPEG格式的图片,这个参数为0-100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95
  • 对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION),从0-9,默认值为3.
  • 对于PPM、PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值为1.

5. 修改图像cv::cvtColor

cvtColor用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。

它的函数原型如下:

void cv::cvtColor (InputArray src,OutputArray dst,int code,int dstCn = 0 ) 	
  • src:输入图像
  • dst:输出图像
  • code:图像转码的方式
  • dstCn:通道数量的目标图像;如果该参数为0时,信道数代码和从SRC中自动得到。

转换的方式code很多种类型。

6. 代码示例和展示

代码示例和注释如下:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main( int argc, char** argv )
{
 Mat image;
 image = imread( "/home/liqiang/Data/vision/classic/lena.jpeg", CV_LOAD_IMAGE_COLOR);

 if( !image.data )
 {
   printf( " No image data \\n " );
   return -1;
 }

 Mat gray_image;
 cvtColor( image, gray_image, CV_BGR2GRAY );//转灰度图,cvtColor中提供了丰富的图像转换


 imwrite( "Gray_Image.jpg", gray_image );//保存灰度图

 namedWindow( "srcImage", CV_WINDOW_AUTOSIZE );
 namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );

 imshow( "srcImage", image );
 imshow( "Gray image", gray_image );

 waitKey(0);

 return 0;
}

cmakList.txt的配置如下:

# project name
PROJECT(opencv_test)
# requirement of cmake version
cmake_minimum_required(VERSION 3.5)

# set the directory of executable files 设置可执行文件的目录
# set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${opencv_test_SOURCE_DIR}/bin)

# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})

# read_modify_write
add_executable(read_modify_write read_modify_write.cpp)
target_link_libraries(read_modify_write ${OpenCV_LIBS})

运行效果如下:
在这里插入图片描述

在这里插入图片描述

以上是关于opencv学习笔记opencv加载图像修改图像显示图像保存图像以及代码举例的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

OpenCV学习笔记3基础:图像基本操作

数字图像处理OpenCV3 学习笔记

OpenCV学习笔记--图像的载入和显示