【问题标题】:OpenCV: create a square Structuring element for HIT-MISSOpenCV:为 HIT-MISS 创建方形结构元素
【发布时间】:2017-12-01 19:48:23
【问题描述】:

我想要一个函数来创建一个“正方形内的正方形”结构元素,例如:

    Mat explicit_kernel = (Mat_<int>(5, 5) <<
                -1, -1, -1, -1, -1,
                -1, 1, 1, 1, -1,
                -1, 1, 1, 1, -1,
                -1, 1, 1, 1, -1,
                - 1, -1, -1, -1, -1);

所以我尝试制作一个丑陋的循环:

Mat generate_kernel(int size)
{
    if (size % 2 == 0)
    {
        printf("Input %i, not even, replaced by %i\n", size, size + 1);
        size++;

    }

    Mat out = Mat::ones(size + 2, size + 2, CV_8S);
    for (int i = 0; i <= size + 1; i++)
    {
        for (int j = 0; j <= size + 1; j++)
        {
            if (i == 0 || i == size - 1)
            {
                out.at<int>(i, j) = -1;
            }
            else
            {
                if (j == 0 || j == size - 1)
                {
                    out.at<int>(i, j) = -1;
                }
            }

        }
    }
    //Mat out = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
    return out;

}

但我遇到了“违规书写错误”,无论如何我正在寻找更简单的需求, 代码的主要目的是在循环内制作结构元素: - 大小为 1 的正方形,大小为 3 ... 谢谢:)

【问题讨论】:

  • 这也是错误的:j &lt;= size + j.
  • 谢谢,我修改为j
  • 但是现在,生成矩阵只是充满了 -1 ,而不是更多的 1

标签: c++ opencv opencv3.0


【解决方案1】:

我找到了一个解决方案,考虑到 cv::Mat 是一个指针,并创建一个子矩阵

Mat generate_kernel(int size)
{
    if (size % 2 == 0)
    {
    printf("Input %i, not even, replaced by %i\n", size, size + 1);
    size++;
}

Mat out = -1 * Mat::ones(size + 2, size + 2, CV_8S);
Mat center = Mat(out, Rect(1, 1, size, size));
center = Mat::ones(size, size, CV_8S);

return out;
}

【讨论】:

    【解决方案2】:

    这可能已经由cv::copyMakeBorder 方法处理。

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    Mat generate_kernel(int size, int outer_size=1)
    {
        if (size % 2 == 0)
        {
            printf("Input %i, not even, replaced by %i\n", size, size + 1);
            size++;
    
        }
        Mat out = Mat::ones(size, size, CV_8S);
        copyMakeBorder(out,
                       out,
                       outer_size, // top
                       outer_size, // bottom
                       outer_size, // left
                       outer_size, // right
                       BORDER_CONSTANT,
                       Scalar(-1.0));
        return out;
    }
    
    int main(int argc, const char * argv[]) {
        cout << "Size 1: " << generate_kernel(1) << endl;
        cout << "Size 3: " << generate_kernel(3) << endl;
        cout << "Size 5: " << generate_kernel(5) << endl;
        return 0;
    }
    

    这会产生以下......

    Size 1: [ -1,  -1,  -1;
              -1,   1,  -1;
              -1,  -1,  -1]
    
    Size 3: [ -1,  -1,  -1,  -1,  -1;
              -1,   1,   1,   1,  -1;
              -1,   1,   1,   1,  -1;
              -1,   1,   1,   1,  -1;
              -1,  -1,  -1,  -1,  -1]
    
    Size 5: [ -1,  -1,  -1,  -1,  -1,  -1,  -1;
              -1,   1,   1,   1,   1,   1,  -1;
              -1,   1,   1,   1,   1,   1,  -1;
              -1,   1,   1,   1,   1,   1,  -1;
              -1,   1,   1,   1,   1,   1,  -1;
              -1,   1,   1,   1,   1,   1,  -1;
              -1,  -1,  -1,  -1,  -1,  -1,  -1]
    

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多