同时基于c++与python版本的opencv进行读取,显示,修改,保存图片操作

同时基于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构成及其参数说明

  1. 图像读取函数imread()的原型
imread()函数的原型
cv::Mat cv::imread(const String & filename,
            int  flags=IMREAD_COLOR
            )

参数一filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名
参数二flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可选参数在表3-1给出。
表3-1-1 imread()函数读取图像形式参数
在这里插入图片描述

  1. 图像窗口函数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()函数窗口属性标志参数
在这里插入图片描述

  1. 图像显示函数imshow的原型
imshow()函数的原型
void cv::imshow(const String & winname,
                  InputArray mat
                  )

参数一winname:要显示图像的窗口的名字,用字符串形式赋值
参数二mat:要显示的图像矩阵

  1. 图像尺寸调整函数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()函数插值方式参数
在这里插入图片描述

  1. 图像保存函数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()函数第三个参数可选择的标志及作用
在这里插入图片描述

  1. 图像函数waitKey的原型
waitKey()函数原型
int cv::waitKey(int delay = k)  
k <= 0的时,如果没有键盘触发,则一直等待,否则返回值为键盘按下的码字;
k > 0:延时k毫秒
  1. 关闭窗口资源的函数 destroyWindow 和 destroyAllWindows 的原型
destroyWindow()关闭指定窗口函数原型
void destroyWindow(const string& winname);

参数一winname:窗口标识符/窗口名称

destroyAllWindows()关闭所有窗口函数原型
void destroyAllWindows();

无参数

4.注意事项(用原文链接解答)

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.注意事项(用原文链接解答)

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)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值