• C++ opencv 图像读取与显示


    1.API和相关知识

    1.imread()

    Mat imread(const string& filename, int flags=1);

    Mat类是用于保存图像yi即其他矩阵数据的数据结构。

    参数说明:

        1. 第一个参数,const string&类型的filename,指我们需要载入图片路径名。

        2. 第二个参数,int类型的flags,为载入标识,指定一个加载图像的颜色类型,默认值为1。

    图像颜色类型有以下几种:

    CV_LOAD_IMAGE_UNCHANGED——等价取值为-1,这个标识在新版本中已被废置,可以忽略

    CV_LOAD_IMAGE_GRAYSCALE——等价取值为0,返回灰色图像

    CV_LOAD_IMAGE_COLOR——等价取值为1,返回彩色图像

    CV_LOAD_IMAGE_ANYDEPTH——等价取值为2,若图像深度是16位或者32位,就返回对应深度,否则,返回8位图像

    如果输入有冲突的标志,将采用较小的数字值

    因为flags是int型,我们也可以这样进行:

    flags>0返回一个3通道彩色图像(解码后的图像以BGR存储)

    flags=0返回灰度图像

    flags<0返回包含Alpha通道的加载图像

    注:imread方式加载进来的图像,都会变成“彩色图像”
    图像路径后面还有一个带缺省值的参数IMREAD_COLOR = 1,即加载时总是转化图片为3通道BGR图像

    补充知识


    图像深度为“1”的解释
    首先介绍一下什么是图像深度(image depth)

    比如imread加载进来的图片是3通道的,每个通道1个字节(8bit),3*8=24位,图像深度就是24。

    opencv中,call API src.depth()检查深度时,不会直接告诉你24位。

    因为24位在opencv中只是一个深度的表示,opencv用一个枚举类型来表示它,这个枚举类型的值可能是1。

    所以有的时候,检查深度时得到1也不要诧异。
    还有,获取某些其他属性时也会出现这种情况,因为opencv规定了很多的枚举数值。
     

    2.imshow()


    注:当使用imshow时,默认方式是WINDOW_AUTOSIZE,产生窗口大小和图像匹配,但无法更改。
    这时候我们创建namedWindow窗口并指定为WINDOW_FREERATIO或WINDOW_NORMAL,就可以调整窗口了
     

    函数格式:

    void imshow(const string& winname, InputArray mat);

    参数说明:

    第一个参数:const string&类型的winname,指需要显示位于窗口标识名称,要创在新建的名字要一样。

    第二个参数:InputArray类型的mat,指需要显示的图像。

    imshow函数用于在指定的窗口中显示图像。如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则将进行缩放以适合窗口。

    imshow函数缩放图像,取决于图像的深度,具体如下:

    如果载入的图像是8位无符号类型,就显示图像本来的样子
    如果图像是16位无符号类型或32位整型,便用像素值除以256。值的范围是[0,255*236]映射到[0,255]
    如果图像是32位浮点型,像素值便要乘以255,值的范围是[0,1]映射到[0,255]
     

    imshow的显示问题

    要注意的是,imshow显示图像时是不支持透明通道的。
    即使我们imread时设置了IMREAD_UNCHANGED,imshow也无法显示透明的信息,会显示成变成黑色/白色

    3.namedWindow

    void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE)

    参数说明:

    第一个参数:const string& 型的name,指用作窗口的表示符的窗口名称。

    第二个参数:int类型的flags,窗口的标识,主要有以下几种。

    flags标识种类:

    WINDOW_NORMAL,可以更改窗口的大小(没有限制)。OpenCV2中可以写为CV_WINDOW_NORMAL。

    WINDOW_AUTOSIZE,窗口大小会自动调整以适应所显示的图像,并且不能修改窗口大小。OpenCV2中可以写为CV_WINDOW_AUTOSIZE。此参数是默认值。

    WINDOW_OPEMGL,窗口会支持OpenGL。OpenCV2中可以写为CV_WINDOW_OpenGL。


    4.resizeWindow
    resizeWindow(window_name, width, height)

    参数:

    • window_name:将显示图像/视频的窗口的名称
    • width:新窗口宽度(整数类型)
    • height:新窗口高度(整数类型)

    5.destroyAllWindows()

    销毁所有打开的窗口

    调用destroyWindow()或者destroyALLWindow()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。(如果程序不大,则不需要此操作,因为在退出时,所有的资源和应用程序的窗口会被操作系统关闭

    6.waitkey()

    1、waitKey()和waitKey(0):表示无尽等待。直到任意按键按下,显示窗口才会关闭。

    2、waitKey(n):等待n毫秒后,显示窗口关闭。

    会返回按键的ascii的值

    # waitKey方法表示等待按键, 0表示任何按键, 其他整数表示等待按键的时间,单位是毫秒, 超过时间没有发生按键操作窗口会自动关闭. 会返回按键的ascii的值,可用此转意,按下按键退出
    
    1. while(1)
    2. {
    3. key = waitKey(0);
    4. if (key== 'q')
    5. {
    6. destroyAllWindows();
    7. }
    8. }

    2.示例代码 读取与显示

    注:想图片和新建窗口在同一个窗口,让他们命名一样就可以索引到

    1. #include "mainwindow.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace cv;
    7. using namespace std;
    8. int key;
    9. int main(int argc, char *argv[])
    10. {
    11. QApplication a(argc, argv);
    12. MainWindow w;
    13. //w.show();
    14. namedWindow("输入窗口", WINDOW_NORMAL);
    15. resizeWindow("输入窗口", 500, 500);
    16. Mat srcImage = imread("C:\\Users\\29492\\Desktop\\Qt +opencv\\project\\xianshi yu xiaohui\\car7.png");
    17. if (srcImage.empty())
    18. {
    19. printf("could not load image……\n");
    20. }
    21. imshow("输入窗口",srcImage);
    22. while(1)
    23. {
    24. key = waitKey(0);
    25. if (ret == 'q')
    26. {
    27. destroyAllWindows();
    28. break;
    29. }
    30. }
    31. return a.exec();
    32. }


     

  • 相关阅读:
    Laravel API认证插件Sanctum
    L1-030 一帮一(Java语言)-天梯赛
    mysql数据库简介及win安装
    3d虚拟现实数字化展厅给予参观者充分的交互性和空间感
    ChatGPT如何应对用户提出的道德伦理困境?
    Python实现直方图梯度提升分类模型(HistGradientBoostingClassifier算法)并基于网格搜索进行优化同时绘制PDP依赖图项目实战
    RabbitMQ学习笔记
    RabbitMQ 入门案例项目
    Telegraf 使用小结
    阿里开源低代码引擎 - Low-Code Engine
  • 原文地址:https://blog.csdn.net/weixin_46098612/article/details/127676558