OpenCV 获取椭圆上的像素

OpenCV get pixels on an ellipse

我正在尝试从图像中获取椭圆的像素。

例如,我在随机图像上画了一个椭圆(示例 geeksforgeeks 代码):

import cv2
path = r'C:\Users\Rajnish\Desktop\geeksforgeeks\geeks.png'
image = cv2.imread(path)
window_name = 'Image'
center_coordinates = (120, 100)
axesLength = (100, 50)
angle = 0
startAngle = 0
endAngle = 360
color = (0, 0, 255)
thickness = 5
image = cv2.ellipse(image, center_coordinates, axesLength,
           angle, startAngle, endAngle, color, thickness)
cv2.imshow(window_name, image)

它给出如下输出:

现在,我想获取椭圆边界线的像素值。如果可能的话,我想使用 cv2.ellipse() 作为坐标数组返回椭圆的像素。
谁能帮我解决这个问题。

可能没有直接的 OpenCV 方法来获取椭圆的这些点,但您可以通过这样的间接方式提取点:

mask = cv2.inRange(image, np.array(color), np.array(color))
contour = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2][0]

contour 将存储红色椭圆的外部点。 在这里,我所做的是创建椭圆的蒙版图像并找到所需的最外部轮廓点。

如果要获取椭圆上的点(位置),可以使用ellipse2Poly()函数。


如果ellipse2Poly()的参数类型不方便,自己计算是最方便的方法。

这个示例代码是C++的,但是计算的很清楚

//Degree -> Radian
inline double RadFromDeg( double Deg ){ return CV_PI*Deg/180.0; }

//Just calculate points mathematically.
//  Arguments are same as cv::ellipse2Poly (alothough ellipse parameters is cv::RotateRect).
void My_ellipse2Poly(
    const cv::RotatedRect &EllipseParam,
    double StartAngle_deg,
    double EndAngle_deg,
    double DeltaAngle_deg,
    std::vector< cv::Point2d > &DstPoints
)
{
    double Cos,Sin;
    {
        double EllipseAngleRad = RadFromDeg(EllipseParam.angle);
        Cos = cos( EllipseAngleRad );
        Sin = sin( EllipseAngleRad );
    }

    //Here, you will be able to reserve the destination vector size, but in this sample, it was omitted.
    DstPoints.clear();

    const double HalfW = EllipseParam.size.width * 0.5;
    const double HalfH = EllipseParam.size.height * 0.5;
    for( double deg=StartAngle_deg; deg<EndAngle_deg; deg+=DeltaAngle_deg )
    {
        double rad = RadFromDeg( deg );
        double u = cos(rad) * HalfW;
        double v = sin(rad) * HalfH;
        double x = u*Cos + v*Sin + EllipseParam.center.x;
        double y = u*Sin - v*Cos + EllipseParam.center.y;
        DstPoints.emplace_back( x,y );
    }
}