快速找出cv::Mat中为特定值的坐标

问题描述:经过语义分割模型输出的分割结果保存在一个cv::Mat变量中,如何快速找到cv::Mat中标签为具体值(例如寻找的标签为13)的坐标,并进行上色呢?

方法1:用for循环对cv::mat 矩阵进行遍历

for (int i = 0; i < imgrow; i++) { //遍历行
    for (int j = 0; j < imgcol; j++) { //遍历列
        int index_row=i,index_col=j;
        int class_Label = mat.at<int>(i, j);
        if(class_Label==13)
        rgbImage.at<cv::Vec3b>(index_row, index_col) = colors[13];
}

缺点:用for循环的方式遍历整个cv::mat,是一个非常耗时的操作,经过测试,这组代码运行时间需要1s以上。

方法2:使用cv自带的函数去访问cv::mat

cv::Mat mask = (mat == 13); 
cv::Mat locations;
cv::findNonZero(mask, locations);
for (int i = 0; i < locations.rows; i++) 
{
   int x = locations.at<int>(i, 0);
   int y = locations.at<int>(i, 1);
   rgbImage.at<cv::Vec3b>(y, x) = colors[13];
}

在这个例子中,使用mat == 13 创建一个布尔掩码 mask,其中值为 true 的元素对应的是像素值为 13 的像素。接着,使用 cv::findNonZero 函数找到掩码中所有非零元素的坐标,并将它们存储在 locations 中。locations 中每一行的前两个元素即为一个值为 13 的像素的 x 和 y 坐标。

经过测试,这种方法运行时间只有1ms左右,运行速度大大提升。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiqiang_z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值