gpt4 book ai didi

python-3.x - OpenCv的circle函数可以用来画奇数直径的圆吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:07:12 26 4
gpt4 key购买 nike

我想在一个 15 乘 15 的矩阵中画一个直径为 15 的圆。为此,我尝试了 OpenCv 的 circle 函数和 shift 函数。

我不确定我是否以正确的方式使用了这个函数,或者我想做的事情是不可能的。

我得到的最好结果是以下大小为 16 像素的不对称圆:

Unsymmetric circle

如何得到一个直径为15像素的对称圆?

我使用的代码:

    import cv2
import numpy as np

circle_diameter = 15
circular_mask = np.zeros((circle_diameter, circle_diameter, 1), dtype='uint8')
#Draw circle with subpixel accuracy
shift = 4
factor = (1 << shift)
cv2.circle(circular_mask, (int(round((circle_diameter/2) * factor)), int(round((circle_diameter/2) * factor))), int(round((circle_diameter/2) * factor)), (255), -1, shift=shift)

circular_mask = cv2.resize(circular_mask,None,fx=5,fy=5)
cv2.imshow("mask", circular_mask)

谢谢

最佳答案

好的,给你。

我将使用 C++ 语法编写,但对于 Python 应该是相同的。

cv::circle 中的像素坐标似乎是指像素中心。

    cv::Mat img = cv::Mat::zeros(15, 15, CV_8UC1);
// in this code, shift must be >= 1 because of the later line (1<<(shift-1)) to add the .5 for an arbitrary shift size
const int shift = 2;

int radiusLow = 7;
int radiusShift = (radiusLow << shift) + (1<<(shift-1)); // + .5

//int x = (7 << shift) + (1<<(shift-1)); // wrong, because the pixel position seems to be the pixel center already. 7.5 would be the right ede of the pixel
//int y = (7 << shift) + (1<<(shift-1)); // wrong, because the pixel position seems to be the pixel center already. 7.5 would be the right ede of the pixel

int x = 7<<shift;
int y = 7<<shift;

cv::circle(img, cv::Point(x, y), radiusShift, cv::Scalar::all(255), -1, 8, shift);

//cv::resize(img, img, cv::Size(), 50, 50); // for visualization

cv::imshow("img", img);
cv::waitKey(0);

但结果似乎有一些像素分散问题,尽管看起来像以蜜蜂为中心且半径为 7.5。调整结果大小以进行可视化。

enter image description here

半径为 6.5 的相同代码(但调整大小因子较小)给出了此图像(在绘制过程中看起来像一些舍入片段)。

enter image description here

另一个测试,使用更多位来表示接近 7.5 半径的数字,但要小一些,以减少绘图中的舍入片段:

    cv::Mat img = cv::Mat::zeros(17, 17, CV_8UC1); // 2 pixels bigger for visualization of possible artifacts

const int shift = 5; // more bits for fraction
int radiusLow = 7;
int radiusShift = (radiusLow << shift) + (1<<(shift-1)) -1; // 7+ 2^-1 - 2^-5

// center of the 17x17 image
int x = 8<<shift;
int y = 8<<shift;

enter image description here

关于python-3.x - OpenCv的circle函数可以用来画奇数直径的圆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57739261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com