Python 将OpenCV与np.float一起使用

Python 将OpenCV与np.float一起使用,python,opencv,Python,Opencv,为什么在使用cv2.line()时它接受np.float32类型转换,但在使用cv2.circle时它一直要求整数 这是真的还是我做错了什么 代码: elif attribute.tag==“LineTo”: nextPoint=attribute.attrib img=cv2.line(img,(np.float32(起始点[“X”]),np.float32(起始点[“Y”]),(np.float32(下一点[“X”]),np.float32(下一点[“Y”]),(255255255),3)

为什么在使用cv2.line()时它接受np.float32类型转换,但在使用cv2.circle时它一直要求整数

这是真的还是我做错了什么

代码:

elif attribute.tag==“LineTo”:
nextPoint=attribute.attrib
img=cv2.line(img,(np.float32(起始点[“X”]),np.float32(起始点[“Y”]),(np.float32(下一点[“X”]),np.float32(下一点[“Y”]),(255255255),3)
开始点=下一点
elif attribute.tag==“ArcTo”:
端点=attribute.attrib
xDiff=np.float32(起始点[“X”])-np.float32(终点[“X2”])
yDiff=np.float32(起始点[“Y”])-np.float32(终点[“Y2”])
如果xDiff>0:
xDiff=xDiff/2
中点=np.float32((np.float32(起始点[“X”])+xDiff)),np.float32(起始点[“Y”]))
打印(中点)
cv2.圆(img,中点,int(abs(xDiff)),(255255),3)
elif xDiff<0:
xDiff=xDiff/2
中点=np.float32((np.float32(起始点[“X”])-xDiff)),np.float32(起始点[“Y”]))
打印(中点)
cv2.圆(img,中点,int(abs(xDiff)),(255255),3)
elif yDiff>0:
yDiff=yDiff/2
中点=np.float32(起始点[“X”]),np.float32((np.float32(起始点[“Y”])+yDiff))
打印(中点)
cv2.圆(img,中点,int(abs(yDiff)),(255255),3)
elif yDiff<0:
yDiff=yDiff/2
中点=np.float(起始点[“X”]),np.float((np.float32(起始点[“Y”])-yDiff))
打印(中点)
cv2.圆(img,中点,int(abs(yDiff)),(255255),3)
错误:

Traceback (most recent call last):
  File "beamer.1.py", line 144, in <module>
    startProjection()
  File "beamer.1.py", line 123, in startProjection
    cv2.circle(img, middlePoint, yDiff, (255,255,255), 3)
TypeError: integer argument expected, got float
回溯(最近一次呼叫最后一次):
文件“beamer.1.py”,第144行,在
startProjection()
文件“beamer.1.py”,第123行,在StartProject中
cv2.圆(img,中点,yDiff,(255255),3)
TypeError:应为整数参数,得到浮点值

由于这些方法接受不同的参数,请查看以下内容:

方法行()

方法循环()

为方便起见,定义了以下类型别名:

typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;
typedef Point_uu2i;
类型定义点2i点;
类型定义点\点2F;
类型定义点\点2D;

只需查看文档即可回答此问题<代码>行取两点<代码>圆取一个点和一个半径。虽然点数可以用浮点数表示,但opencv要求半径为
int

谢谢您的回答,但我使用的是python,python没有等效的值cvPoint@MickRemmerswaal不,Python的OpenCV不使用OpenCV中的C++结构,但它使用的是底层的数据类型。(32/64位浮点、8/16位图像等)。容器不同,容器内的数据类型相同。感谢您的回复,但似乎即使我将xDiff和yDiff转换为整数,错误仍然存在。因此,错误位于中点,我的问题是。我无法将绘图点转换为np.float在cv2.circle中,但可以在cv2中。line@MickRemmer什么时候将它们转换为
int
?如果在除以2之前将它们转换为
int
,则会再次将它们转换为浮点数。
cv2.circle()
可以与
shift
参数一起使用。我不理解你的问题。圆心必须作为两个整数的元组给定。你传递两个浮点,并惊讶地发现它生成了一个错误,表示它期望整数,但得到了浮点。我必须在这里遗漏一些东西……这就是它,但我的问题是,当给定时浮动到cv2.line有效,但当给予cv2.circle无效。我的问题是,为什么会有这种不一致性?是这样的,不一致,还是我真的遗漏了什么。因为当它不一致时,我可以解决它。但我不是因为我需要小数来保证准确性。是的,OpenCV只是不一致se有两个功能。这是“完全正确的”我猜这种不一致性是由于整数的性能要高得多,而不是圆形绘图中的浮点数。或者可能函数只是由两个不同的人在不同的时间编写的。无论如何,你可以。此外,亚像素精度对于检测目的来说是一件事,但对于绘图来说,这不是一个问题。你不能原始的东西是亚像素级的。即使以一个角度画一条简单的线,也有各种不同的方法:不同的混叠算法,不管你要求线是4或8连接的,二进制的还是混合的,等等。你应该让你的程序完全忽略这一点(也就是说,如果你需要某个特定半径的东西……只需将其直接与距离函数一起使用;不要依赖像素推送),或者研究实现以精确了解它们的工作原理。有一种方法可以在OpenCV中绘制反序列化圆。在Python中,我能够创建一个关键点(x,y,半径都是浮点数)并绘制它。pt1=cv2.keypoint(x,y,radius)frame=cv2.drawKeypoints(frame[pt1],np.array([]),(0200,0),cv2.DRAW\u匹配\u标志\u DRAW\u RICH\u关键点)
void cv::line (
    InputOutputArray img,
    Point pt1,
    Point pt2,
    const Scalar & color,
    int thickness = 1,
    int lineType = LINE_8,
    int shift = 0 
)
void cv::circle(
    InputOutputArray img,
    Point center,
    int radius,
    const Scalar &      color,
    int thickness = 1,
    int lineType = LINE_8,
    int shift = 0 
)
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;