【问题标题】:Change columns order in opencv mat without copying data在不复制数据的情况下更改 opencv mat 中的列顺序
【发布时间】:2017-11-13 11:31:46
【问题描述】:

我有一个有 M 行和 3 列的 opencv 垫子,有没有办法重新排序垫子,以便在中间列保持原位的同时切换第一列和最后一列(即第三列)没有 复制数据?

【问题讨论】:

  • 你能详细说明什么是“不复制数据”吗?
  • @I.Newton :当然,我的意思是没有逐个元素的深度复制,而只是“玩”垫子的标题

标签: c++ opencv


【解决方案1】:

OpenCV 数据是一个像素数组。有时您可以获得图像的列或矩形视图(例如 col() )。其中数据不是连续的,据我所知,它是在行之间用一个步长计算的。但是数据是共享的,仍然是一个数组。

那么问题就变成了:我可以在不复制数据的情况下交换数组的两个部分吗?据我所知没有。

您可以使用OpenCV的优化功能来交换它们,但数据会被复制。

此外,非连续数据比 OpenCV 函数中的连续数据要慢得多。更多可以read here

【讨论】:

  • “read”的过去时(发音为“reed”,或 auf Deutch,“ried”)是“read”(发音为“red”,或 auf Deutch,“rädd”)。对此感到抱歉。
  • @MartinBonner 哎呀,心理分割错误,感谢指正:)
【解决方案2】:

您可以为此使用 OpenCV 函数 flip。例如,下面的代码会翻转中间列的图像。

int main ()

{
    Mat img, flipped;       //your mat

    img =imread("lena.jpg");

    flip(img,flipped ,1);  // flipped is the output

    imshow("img",flipped);
    waitKey(0);

}

【讨论】:

  • 谢谢,这就是我一直在寻找的
  • @BennyK 只是让您知道,翻转也可以进行深度复制,但这是可以通过 opencv 以非常快速的方式完成的方法之一。如果需要任意列,可以查看 cv::swap 和 cv::col
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多