关于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
超级有用:对于小白的我来说让我看懂了程序里的话就是有用的!
- https://blog.csdn.net/u012655441/article/details/69258719
Mat image(240, 320, CV8UC3);
第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示创建一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。 - https://blog.csdn.net/seekforcode/article/details/82021855
(以下为转载上面这个连接的转载)
不过最新的学习发现,如果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;
- 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)
- 延时delay = 0 函数则延时无限长,必须有键按下才继续执行。
- 延时delay > 0 函数返回值为按下的键的ASCII码值,超时则返回-1。
也就是说必须在有窗口显示的情况下,waitKey才有作用,否则无效。
https://blog.csdn.net/a1809032425/article/details/81952952
https://www.jianshu.com/p/30c40d7ce5dc
如果设置waitKey(0),则表示程序会无限制的等待用户的按键事件
- 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中的,但是不会用)