OPENCV:为击中创建一个正方形结构元素

OpenCV: create a square Structuring element for HIT-MISS

本文关键字:一个 正方形 元素 结构 创建 OPENCV      更新时间:2023-10-16

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

    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 %in", 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 ...谢谢:)

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

Mat generate_kernel(int size)
{
    if (size % 2 == 0)
    {
    printf("Input %i, not even, replaced by %in", 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;
}

这可能已经通过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 %in", 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]