关于#opencv#的问题:使用自定义结构元素进行击中击不中变换时发现如下问题:自定义结构元素如下:(语言-c++)

使用自定义结构元素进行击中击不中变换时发现如下问题:
自定义结构元素如下:

    float kernel_data_b[8][8] = {
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
    };
    cv::Mat kernel_b = cv::Mat(8, 8, CV_32FC1, &kernel_data_b);
    cv::Point center_b = (7, 7);  // b结构单元的中心点

img


这个点的实际坐标是(15, 62), 但是检测出来的点是(15,55),在Y方向上查出一个结构元素的大小,这是为什么?

关于设置结构元素中心点,原来的代码是这样写的 cv::Point center_b = (7, 7); 就会出现上述问题
但是改成 cv::Point center_b = Point(7, 7); 之后就解决问题了

这是因为在OpenCV中的结构元素默认以左上角为原点进行定义,而不是以中心点为原点(你在代码中使用的是中心点坐标)。因此,在你的自定义结构元素中,第一个像素的实际坐标应该是(0,0),而不是(-3.5,-3.5)。

对于你的结构元素,由于其尺寸为8x8,因此它的中心点坐标实际上应该是(3, 3),而不是(7, 7)。因此,修改你的代码如下:

float kernel_data_b[8][8] = {
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 1},
        {1, 1, 1, 1, 1, 1, 1, 1},
    };
cv::Mat kernel_b = cv::Mat(8, 8, CV_32FC1, &kernel_data_b);
cv::Point center_b = (3, 3);  // b结构单元的中心点

你能给出完整的代码吗?
特别是morphologyEx这个函数参数