OpenCV图像知识

21 篇文章 0 订阅
11 篇文章 6 订阅

在这里插入图片描述

关于mat函数

看不懂系列:不过感觉好像挺全的,就粘过来了
https://blog.csdn.net/listener51/article/details/46117601#t0 (全)
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/mat - the basic image container/mat - the basic image container.html
https://blog.csdn.net/guyuealian/article/details/70159660
https://blog.csdn.net/giantchen547792075/article/details/9107877
https://www.cnblogs.com/justkong/p/7278579.html
超级有用:对于小白的我来说让我看懂了程序里的话就是有用的!

不过最新的学习发现,如果CV::MAT中的数据是连续的,也可以把数据用memcpy拷贝到对应的data指针指向的内存中。不过需要注意的是如果不连续,这样做是不可以的。


我之前项目中需要做的是把CV::MAT中的数据按字节取出,通过tcp发送出去,对方收到后重新根据接收到的字节流组装起来显示就需要用到以下构造函数:

inline Mat::Mat(int _rows, int _cols, int _type)
 
 

需要输入的是创建的图像大小的行列和type,行列自然不必说,那么就说一下type吧,这边参考了https://blog.csdn.net/u013270326/article/details/72954232,由于这篇博文排版有点问题,所以我就把最核心的内容摘录下来,以备以后查阅

举个例子:

cv::Mat testImg(1080,1920,CV_8UC4);
 
 

可以看到这里的type都是 CV_<bit_depth>(S|U|F)C<number_of_channels>这种格式的。其解释为:

1--bit_depth---比特数---代表8bite,16bites,32bites,64bites
2--S|U|F--
        S--代表---signed int---有符号整形
        U--代表--unsigned int--无符号整形
        F--代表--float---------单精度浮点型
3--C<number_of_channels>----代表---一张图片的通道数,比如:
         1--灰度图片--grayImg---是--单通道图像
         3--RGB彩色图像---------是--3通道图像
         4--带Alph通道的RGB图像--是--4通道图像

举个栗子:

     【1】CV_8UC1---则可以创建----8位无符号的单通道---灰度图片------grayImg

     【2】CV_8UC3---则可以创建----8位无符号的三通道---RGB彩色图像---colorImg

     【3】CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像

图像格式及转换代码

图像格式:
https://www.cnblogs.com/xiangism/p/5311314.html
格式转换:
https://www.brobwind.com/archives/1465

RGBA系列
首先就是rgba系列的格式,RGBA色彩主要用于色彩的显示和描述。常见的有RGBA/ARGB/BGRA/ABGR/RGB/BGR。这些格式都比较好理解了。R、G、B、A分别表示红绿蓝及透明通道。 (透明通道是说这个图片可以变透明)
以RGBA为例,就是4个字节表示一个颜色值,排列方式就是RGBARGBARGBA这样排列。而RGB,就是三个字节表示一个颜色值,没有透明通道,排列方式就是RGBRGBRGB。在通常的视频中,也是没有透明通道的(也有例外,比如MOV格式,是可以包含透明通道的)。所以当RGBA编码为视频色彩时,A是会被丢掉的。
当然,上面说的,是将每个色彩都用一个字节来表示的情况。RGBA也有RGBA_8888,RGBA_4444,RGB565等等众多格式,也就是并不是每个颜色都用一个字节来表示。以RGB565为例,是用两个字节来表示RGB三个色彩,R占5位,G占6位,B占5位。RGB565与RGB24相比,色彩上稍有损失,一般情况下,不细致对比,不容易发现这个损失,但是内存上会节约1/3的大小。

关于imshow(“rgb2depth”,i_depthToRgb)

前面的参数是要显示的窗口的名字,后面的参数是要显示的图片(存储图片数据的)
https://blog.csdn.net/weixin_42132144/article/details/82177438
https://blog.csdn.net/fanjiule/article/details/81604454

关于if(waitKey(1)==VK_ESCAPE) break;

  1. waitKey(1)
    1.1 waitKey()–这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环)
    1.2 如下所示: while(1){ if(waitKey(100)==27)break; } 在这个程序中,我们告诉OpenCv等待用户触发事件,等待时间为100ms,如果在这个时间段内, 用户按下ESC(ASCII码为27),则跳出循环,否则,则继续循环
    1.3 如果设置waitKey(0),则表示程序会无限制的等待用户的按键事件
    注意:python下cv.waitKey无响应原因
    按下键的时候,焦点要落在窗口上,不能落在cmd窗口上。
    另外,一般在imshow()后要使用waitKey(),给图像绘制留下时间,不然窗口会出现无响应情况,并且图像无法显示出来。
    int waitKey(int delay=0)
  1. VK_ESCAPE
    https://blog.csdn.net/u010999396/article/details/52397401
    题目中VK_ESCAPE对应ESC,其ASCII码为27,所以这个句子的意思和上述是一样的,就是1ms内如果用户按下而ESC键,则跳出。

关于imwrite(output_RGB,i_rgb);

https://blog.csdn.net/qq_33835307/article/details/81450237
https://www.cnblogs.com/skyfsm/p/7136709.html
保存图像文件
示例:保存result数据为名字是“年-月-日-时-分-秒-rgb2depth.png”的文件

char output_rgb2depth[32];
sprintf_s(output_rgb2depth, "%4d-%2d-%2d-%2d-%2d-%2d-rgb2depth.png", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
imwrite(output_rgb2depth, result);

关于glColor3ubv(rgb);

https://blog.csdn.net/meegomeego/article/details/8306257
https://baike.baidu.com/item/glColor/9516595?fr=aladdin
(我只知道这个时opengl中的,但是不会用)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值