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加载图像修改图像显示图像保存图像以及代码举例的主要内容,如果未能解决你的问题,请参考以下文章