在OpenCV中添加两个Mat到窗口中
Adding two Mat into a window in OpenCV
根据OCV数组操作的链接,我没有找到拥有两个不同Mat的方法,并将它们放入显示两个图像的唯一窗口。
PS:这不是关于合并成一个单一的图像。
任何想法?
使用Qt和这个函数:如何将opencv cv::Mat转换为qimage
Highgui不支持每个窗口多个矩阵
我认为在纯opencv中不可能做到这一点,因为opencv是图像处理库,只支持最少的用户界面,只有一些功能。
你可以创建一个更大的Mat,包含你原来的两个图像。为了能够区分图像,你可以创建一个黑线边界,例如:
// the 20 there is an example for border between images
Mat display = Mat::zeros ( MAX ( image1.rows, image2.rows ), image1.cols + 20 + image2.cols, image1.type() );
image1.copyTo ( Mat ( display, Rect ( 0, 0, image1.cols, image1.rows ) ) );
image2.copyTo ( Mat ( display, Rect ( image1.cols + 20, 0, image2.cols, image2.rows ) ) );
我正在考虑同样的事情,遇到了你的问题。考虑到Mat的工作方式,它实际上只是一个智能指针,即具有定义其指向的数据如何组织的头信息。
这意味着您不能使用mat容器,并且现在所有显示相关的内容一次只能使用一个mat对象。所以一个好的简单有效的方法是不容易实现的。
警告,您现在负责自己处理内存
如果你下定决心去做(我知道那种感觉,我这样做是因为我找不到更好的选择)。你可以在内存中为你的数据缓冲区分配一个连续的空间。
现在,您可以按照您认为适合多个映像的方式对内存进行分区。即使用指针算术。你需要确保你想要显示的图像是相邻的。
此时,您可以使用Mat(cv::Size size, int type, void *buffer)
创建一个Mat对象,该对象覆盖您的2个对象的整个内存空间。
当然,使用这种方法,它们会永久地粘在一起,形成一定的形状。
显然,这也可以用另一种方式来完成,即创建mat对象并让它分配空间,然后使用uchar *data
成员从mat对象中获取数据指针(记住将指针算术转换为您首选的类型)。你可以使用这个缓冲区创建2个新的Mat对象。
遗憾的是,由于Mat对象在内存中的表示方式,该方法不允许您进行水平连接。
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 计算 OpenCV 中两个 Mat 文件的相关性
- 两个Mat图像的压缩比
- 在OpenCV,Java中添加两个Mat时出错
- 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么两个 cv::Mat 实例有什么区别
- 在OpenCV中添加两个Mat到窗口中
- 合并两个cv::Mat而不复制数据