zoukankan      html  css  js  c++  java
  • opencv像素操作的加速

    背景:煤矸石识别项目,需要先检测再识别,检测采用基于轮廓的定位方法,先找出轮廓,再求出轮廓的质心作为检测目标的中心点。但是遇到问题:图像边缘的煤矸石轮廓无法闭合,找到的中心店不准确,有时会出现一块石头两个中心点的情况

     对预处理图像进行像素操作,图像二值化后将边界全部赋值为255也就是填充为白色可以解决这个问题

     最开始采用的方法是遍历像素点,但是这种方法太慢

    for(int row=0;row<morImg.rows;++row)
            for (int col = 0; col < morImg.cols; ++col)
            {
                if (col <= 1 || row <= 1 || col >= morImg.cols - 2 || row >= morImg.rows - 2)
                    morImg.at<uchar>(row, col) = 255;
            }

    耗时0.0014209s

     利用opencv中的setTo函数来取代遍历赋值像素的操作可以加快速度

    morImg(Rect(0, 0, 2, morImg.rows)).setTo(255);
    morImg(Rect(morImg.cols-2, 0, 2, morImg.rows)).setTo(255);
    morImg(Rect(0, 0, morImg.cols, 2)).setTo(255);
    morImg(Rect(0, morImg.rows-2, morImg.cols, 2)).setTo(255);

    利用浅拷贝对边界像素直接赋值

    耗时大概是遍历的五分之一

    计时函数在这里

     把他打开,然后引入这个头文件

    #include <omp.h>

    就可以显示时间了

    startTime = omp_get_wtime();
    morImg(Rect(0, 0, 2, morImg.rows)).setTo(255);
    morImg(Rect(morImg.cols-2, 0, 2, morImg.rows)).setTo(255);
    morImg(Rect(0, 0, morImg.cols, 2)).setTo(255);
    morImg(Rect(0, morImg.rows-2, morImg.cols, 2)).setTo(255);
    spandTime = omp_get_wtime() - startTime;
    cout << "消耗时间: " << spandTime << endl;
  • 相关阅读:
    jquery 实现 返回顶部
    js 10秒倒计时 功能
    2019.6.10 工作日志
    2019.4.25 工作日志
    2019.4.22 工作日志
    2019.4.13 工作日志
    2019.3.12 工作日志
    2019.1.22 工作日志
    2019.1.18 工作日志
    2019.1.14 工作日志
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/13522060.html
Copyright © 2011-2022 走看看