文章目录
同时基于c++与python版本的opencv进行读取,显示,修改,保存图片操作
一、基于c++的opencv
1.c++版本代码
代码如下(示例):
#include <opencv2/opencv.hpp>
#include <iostream>
//所有OpenCV类和函数都放置在cv命名空间中。
//因此,要从代码中访问此功能,需要使用说明cv::符或using namespace cv指令:
using namespace cv;
using namespace std;
//argc与argv中的arg表示的是“参数”,
//其中argc经常表现的是是int类型的整数,而argv带上*表示字符串数组。
int main(int argc, char** argv) {
//读入图片
Mat src = imread("D:/vs2019/photo/lenacolor.png"),dst;
//如果读入为空,返回could not find image file
if (src.empty()) {
printf("could not find image file");
return -1;
}
//显示输入图片
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//修改图片尺寸
resize(src, dst, Size(1080, 1080));
//显示输出图片
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", dst);
//保存图片
imwrite("D:/output_lena.png", dst);
//等待用户按键输入
waitKey(0);
//销毁所有窗口
destroyAllWindows();
return 0;
}
2.代码结果展示
输入输出图片展示:
3.API构成及其参数说明
- 图像读取函数imread()的原型
imread()函数的原型
cv::Mat cv::imread(const String & filename,
int flags=IMREAD_COLOR
)
参数一filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名
参数二flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可选参数在表3-1给出。
表3-1-1 imread()函数读取图像形式参数
- 图像窗口函数namedWindow的原型
namedWindow()函数的原型
void cv::namedWindow(const String & winname,
int flags = WINDOW_AUTOSIZE
)
参数一winname:窗口名称,用作窗口的标识符
参数二flags:窗口属性设置标志,主要用于设置窗口的大小是否可调、显示的图像是否填充满窗口等,具体可选择的参数及含义在表3-2中给出,默认情况下函数加载的标志参数为“WINDOW_AUTOSIZE | WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED”。
表3-2 namedWindow()函数窗口属性标志参数
- 图像显示函数imshow的原型
imshow()函数的原型
void cv::imshow(const String & winname,
InputArray mat
)
参数一winname:要显示图像的窗口的名字,用字符串形式赋值
参数二mat:要显示的图像矩阵
- 图像尺寸调整函数resize的原型
resize()函数的原型
void cv::resize(InputArray src, OutputArray dst, Size dsize,
double fx=0, double fy=0,
int interpolation=INTER_LINEAR
)
参数一src:输入,原图像,即待改变大小的图像;
参数二dst: 输出,改变后的图像。这个图像和原图像具有相同的内容,只是大小和原图 像不一样而已;
参数三dsize:输出图像的大小。
参数四fx:沿着水平轴的缩放系数;
参数五fy:沿着垂直轴的缩放系数;
参数六interpolation:插值方式默认为 INTER_LINEAR 线性插值,具体可选择的参数及含义在表3-4中给出;
表3-2 resize()函数插值方式参数
- 图像保存函数imwrite()的原型
imwrite()函数原型
bool cv :: imwrite(const String& filename,
InputArray img,
Const std::vector<int>& params = std::vector<int>()
)
参数一filename:保存图像的地址和文件名,包含图像格式
参数二img:将要保存的Mat类矩阵变量
参数三params:保存图片格式属性设置标志,第三个参数的设置方式如代码清单3-5-1中所示,常见的可选择设置标志在表3-5-2中给出。
代码清单3-5-1 imwrite()函数中第三个参数设置方式
vector <int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
imwrite(filename, img, compression_params)
表3-5-2 imwrite()函数第三个参数可选择的标志及作用
- 图像函数waitKey的原型
waitKey()函数原型
int cv::waitKey(int delay = k)
k <= 0的时,如果没有键盘触发,则一直等待,否则返回值为键盘按下的码字;
k > 0:延时k毫秒
- 关闭窗口资源的函数 destroyWindow 和 destroyAllWindows 的原型
destroyWindow()关闭指定窗口函数原型
void destroyWindow(const string& winname);
参数一winname:窗口标识符/窗口名称
destroyAllWindows()关闭所有窗口函数原型
void destroyAllWindows();
无参数
4.注意事项(用原文链接解答)
-
使用OpenCV实现图像覆盖
转发博主关于图像覆盖实战的理解 -
【从零学习OpenCV 4】图像读取函数imread
转发博主关于imread函数的理解1 -
【从零学习OpenCV 4】namedWindow函数&imshow函数的使用
转发博主关于namedWindow函数&imshow函数的理解1 -
【从零学习OpenCV】图像的保存imwrite&视频的保存
转发博主关于imwrite函数的理解1 -
opencv中的resize 函数 的理解以及引申
转发博主关于resize 函数的理解1 -
【C++ opencv-resize函数(调整图像大小)】
转发博主关于resize 函数的理解2 -
python opencv 图像大小_python使用OpenCV设置图片尺寸
转发博主关于resize 函数的理解3 -
使用c++ opencv操作时常用API汇总
转发博主关于常用API的理解 -
OpenCV 常用模块及API使用简介 C++版(主要有关点point)
转发博主关于常用模块的理解 -
OpenCV 4.x API 详解与C++实例-结构分析和形状描述(后面学习用得到先插个眼)
转发博主关于常用API 详解的理解 -
opencv之cvWaitKey()函数详解
转发博主关于WaitKey()函数的理解 -
opencv——waitKey函数
转发博主关于WaitKey()函数的理解2 -
OpenCV的waitKey函数详解
转发博主关于WaitKey()函数的理解3
5.总结
初学阶段,包括其他学习阶段我觉得应该先简后杂,一开始太详细了不利于入门,首先了解整体框架再清楚各个API的用法,有个基本框架了,后面再慢慢深入学习!
二、基于python的opencv
1.python版本代码
代码如下(示例):
#导入opencv包
import cv2
#自行创建一个窗口
cv2.namedWindow('input_Window', cv2.WINDOW_NORMAL)
#修改窗口尺寸
cv2.resizeWindow('input_Window', 320, 240)
#显示input_Window窗口
cv2.imshow('input_Window', 0)
#读取图片
img = cv2.imread("perspective.jpeg")
#修改图片尺寸
resize_img = cv2.resize(img, dsize=(640, 480))
#深拷贝
img3 = resize_img.copy()
while True:
#需要创建图片显示窗口
cv2.namedWindow('output_photo', cv2.WINDOW_NORMAL)
#显示图片img3
cv2.imshow('output_photo', img3)
#等待按键输入
key = cv2.waitKey(0)
#当按键输入为q时候退出
if(key & 0xFF == ord('q')):
break
# 当按键输入为s时候保存
elif(key & 0xFF == ord('s')):
#保存图片
cv2.imwrite("D:/output.jpeg", img)
else:
#按其他按键时候打印键值
print(key)
#退出时候销毁所有的窗口
cv2.destroyAllWindows()
2.代码结果展示
输入输出图片展示:
3.API构成及其参数说明
- 读入图像 cv2.imread() 函数
使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径(相对路径), 或者给函数提供完整路径,第二个参数是要告诉函数应该如何读取这幅图片。
• cv2.IMREAD_COLOR:读入一副彩色图像.图像的透明度会被忽略,这是默认参数.
• cv2.IMREAD_GRAYSCALE:以灰度模式读入图像.
• cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha.
import cv2
img = cv2.imread('messi5.jpg',0)
警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print(img)时得到的结果是None。
- 显示图像cv2.imshow()函数
使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一 个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜欢,但是必须给他们不同的名字。
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行;如果没有键盘输入,返回值为 -1;如果我们设置这个函数的参数为 0,那它将会无限期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否被按下。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果 你想删除特定的窗口可以使用
cv2.destroyWindow(),在括号内输入你想删 除的窗口名。
建 议:一种特殊的情况是,你也可以先创建一个窗口,之后再加载图像。这种情况下,你可以决定窗口是否可以调整大小。使用的函数是cv2.namedWindow()。初始设定函数标签是cv2.WINDOW_AUTOSIZE。但是如果你把标签改成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用。
代码如下:
cv2.namedWindow('image', cv.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 保存图像 cv2.imwrite() 函数
使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。
代码如下:
cv2.imwrite('messigray.png',img)
4.注意事项(用原文链接解答)
-
cv2 imread()函数
转发博主关于cv2 imread()函数的理解 -
Python-OpenCV常用函数的参数及参数意义
转发博主关于常用函数的理解 -
opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度
转发博主关于图像读取及其通道与灰度函数的理解 -
OpenCV-Python (官方)中文教程(部分一)
转发博主关于官方中文教程函数的理解
5.总结
上文已经详细总结了c++常用函数API的构造及其参数说明,此处的python版本只需找出异同,下文会给出!
三、总结python和c++两个版本的异同
- 代码对比图
- 分析
- 前期准备
c++版本需要头文件,命名空间和主函数
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
system("pause");
return 0;
}
python需要导入包
import cv2
- 读取图片
c++版本
//读入图片
Mat src = imread("D:/vs2019/photo/lenacolor.png"),dst;
python版本
#读取图片
img = cv2.imread("back.jpeg")
- 显示图片
c++版本
//显示输入图片
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
python版本
#需要创建图片显示窗口
cv2.namedWindow('output_photo', cv2.WINDOW_NORMAL)
#显示图片img3
cv2.imshow('output_photo', img3)
- 修改图片
c++版本
//修改图片尺寸
resize(src, dst, Size(1080, 1080));
python版本
#修改图片尺寸
resize_img = cv2.resize(img, dsize=(640, 480))
- 保存图片
c++版本
//保存图片
imwrite("D:/output_lena.png", dst);
python版本
#保存图片
cv2.imwrite("D:/output.jpeg", img)