C++ opencv cpp中以八角形表示的Matlab strel函数参数

C++ opencv cpp中以八角形表示的Matlab strel函数参数,c++,matlab,opencv,image-processing,C++,Matlab,Opencv,Image Processing,我有几行matlab代码用于应用八角形结构元素。我想将相同的代码转换为opencv cpp Matlab代码 Opencv Cpp代码 我知道我们可以创建一个结构元素,然后我们必须调用腐蚀函数,但是如何在opencv中创建八角形结构元素 element = ?? erode(image,dst,element); 如何在opencv中创建八角形结构元素?一个简单的方法是计算八角形的顶点,并使用fillConvexPoly绘制八角形 M必须是3的非负倍数(如在Matlab中) 代码 #inclu

我有几行matlab代码用于应用八角形结构元素。我想将相同的代码转换为opencv cpp

Matlab代码 Opencv Cpp代码 我知道我们可以创建一个结构元素,然后我们必须调用腐蚀函数,但是如何在opencv中创建八角形结构元素

element = ??
erode(image,dst,element);

如何在opencv中创建八角形结构元素?一个简单的方法是计算八角形的顶点,并使用
fillConvexPoly
绘制八角形

M
必须是3的非负倍数(如在Matlab中)

代码

#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

Mat1b getOctagon(int M)
{
    // M positive and multiple of 3
    CV_Assert((M > 0) && ((M % 3) == 0));

    int k = M / 3;
    int rows = M*2 + 1;
    int cols = M*2 + 1;
    Point c(M, M);

    Mat1b strel(rows, cols, uchar(0));

    // Octagon vertices

    //       0-1
    //      /   \
    //     7     2
    //     |  c  |
    //     6     3
    //      \   /
    //       5-4    


    vector<Point> vertices(8);
    vertices[0].x = c.x - k;
    vertices[0].y = 0;
    vertices[1].x = c.x + k;
    vertices[1].y = 0;

    vertices[2].x = cols-1;
    vertices[2].y = c.y - k;
    vertices[3].x = cols-1;
    vertices[3].y = c.y + k;

    vertices[4].x = c.x + k;
    vertices[4].y = rows-1;
    vertices[5].x = c.x - k;
    vertices[5].y = rows-1;

    vertices[6].x = 0;
    vertices[6].y = c.y + k;
    vertices[7].x = 0;
    vertices[7].y = c.y - k;

    fillConvexPoly(strel, vertices, Scalar(1));

    return strel;

}


int main()
{
    Mat1b kernel = getOctagon(3);

    //morphologyEx(src, dst, MORPH_ERODE, kernel);

    return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
Mat1b getOctagon(整数M)
{
//M为正,是3的倍数
CV_断言((M>0)和((M%3)==0));
int k=M/3;
int行=M*2+1;
int cols=M*2+1;
c点(M,M);
Mat1b strel(行,列,uchar(0));
//八角顶点
//       0-1
//      /   \
//     7     2
//| c|
//     6     3
//      \   /
//       5-4    
向量顶点(8);
顶点[0].x=c.x-k;
顶点[0],y=0;
顶点[1]。x=c.x+k;
顶点[1],y=0;
顶点[2]。x=cols-1;
顶点[2]。y=c.y-k;
顶点[3]。x=cols-1;
顶点[3],y=c.y+k;
顶点[4]。x=c.x+k;
顶点[4]。y=行-1;
顶点[5].x=c.x-k;
顶点[5]。y=行-1;
顶点[6]。x=0;
顶点[6],y=c.y+k;
顶点[7]。x=0;
顶点[7]。y=c.y-k;
FillConverExpoly(strel,顶点,标量(1));
回归线;
}
int main()
{
Mat1b内核=getOctagon(3);
//形态学(src、dst、形态侵蚀、内核);
返回0;
}
结果

M=3:

M=12:


除非您自己创建结构元素,否则不会有等价的调用。谢谢您的回复。如何创建八角形结构元素。plzi如果椭圆符合您的需要,您可以使用内置函数
cv::getStructuringElement(int-shape,Size-ksize,Point-anchor=Point(-1,-1))
,其中形状可以是“变形直线”、“变形椭圆”或“变形十字”。更多信息请访问MATLAB中的Do
open strel
,然后搜索
MakeOctagonStrel
函数。你可以把这个源码翻译成OpenCV C++。谢谢,我会试试的。
#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

Mat1b getOctagon(int M)
{
    // M positive and multiple of 3
    CV_Assert((M > 0) && ((M % 3) == 0));

    int k = M / 3;
    int rows = M*2 + 1;
    int cols = M*2 + 1;
    Point c(M, M);

    Mat1b strel(rows, cols, uchar(0));

    // Octagon vertices

    //       0-1
    //      /   \
    //     7     2
    //     |  c  |
    //     6     3
    //      \   /
    //       5-4    


    vector<Point> vertices(8);
    vertices[0].x = c.x - k;
    vertices[0].y = 0;
    vertices[1].x = c.x + k;
    vertices[1].y = 0;

    vertices[2].x = cols-1;
    vertices[2].y = c.y - k;
    vertices[3].x = cols-1;
    vertices[3].y = c.y + k;

    vertices[4].x = c.x + k;
    vertices[4].y = rows-1;
    vertices[5].x = c.x - k;
    vertices[5].y = rows-1;

    vertices[6].x = 0;
    vertices[6].y = c.y + k;
    vertices[7].x = 0;
    vertices[7].y = c.y - k;

    fillConvexPoly(strel, vertices, Scalar(1));

    return strel;

}


int main()
{
    Mat1b kernel = getOctagon(3);

    //morphologyEx(src, dst, MORPH_ERODE, kernel);

    return 0;
}