当前位置: 首页 > 知识库问答 >
问题:

围绕Hough圆点的OpenCV裁剪

孙明德
2023-03-14

我正在使用OpenCV和Python在图像中查找圆。我能够使用OpenCV教程中的Hough圆变换代码找到圆。我想在圆心周围裁剪一个矩形。我没有能够得到正确的裁剪功能,并尝试了多种裁剪组合,要么得到了一个错误或图像的不正确部分。有人能说明我应该如何输入裁剪坐标吗?这就是我一直遇到的错误:

错误:(-215)大小。宽度

谢谢!

img = cv2.imread('myPicture.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20)

circles = np.uint16(np.around(circles))


for i in circles[0,:]:
    #draw outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    #draw center of circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

    #crop ROI around circle...? 
    crop_cimg = cimg[i[0]:500,i[1]:700] #crop from x, y, w, h 


cv2.imshow('detected circles',crop_cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

共有2个答案

苗康平
2023-03-14

只要错误可能来自crom\u cimg参数,您是否检查了以下内容:

>

  • 图片是否足够大,以便达到(x,y)=(499699)像素?

    i[0]应大于0且小于500

    i[1]应大于0且小于700

  • 漆雕升
    2023-03-14

    确保您处于原始图像的有效边界内。以下代码未经测试,但您应该能够解决可能的错误。

    还要注意坐标与行/列索引(它们是相互交换的)。对于大多数opencv方法,坐标是合适的,但裁剪实际上是对numpyund的切片操作,因此使用行/列索引。

    img = cv2.imread('myPicture.jpg',0)
    img = cv2.medianBlur(img,5)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    
    circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20)
    
    circles = np.uint16(np.around(circles))
    
    cropSize = (500, 700) # <- added: what size do you want to extract
    
    for i in circles[0,:]:
        #draw outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
        #draw center of circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    
        #crop ROI around circle...?
        # make sure the bounds won't under-/overflow
        cropCoords = (max(0, i[1]-cropSize[0]//2),min(img.shape[0], i[1]+cropSize[0]//2),
                      max(0, i[0]-cropSize[1]//2),min(img.shape[1], i[0]+cropSize[1]//2)) 
        crop_cimg = cimg[cropCoords[0]:cropCoords[1],
                         cropCoords[2]:cropCoords[3]] 
    
    
    cv2.imshow('detected circles',crop_cimg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
     类似资料:
    • 我尝试过各种演示代码,如“opencv查找:轮廓”,模板匹配(效果不好,因为它无法检测到顶盖的旋转) 我发现最好的方法是将Canny边缘检测和Hough变换圆相结合,这样Canny边缘检测的输出结果可以是Hough变换圆的输入图像,结果如下。 不幸的是,并非所有圆圈都被检测到,如果我更改

    • 我有两个矩形,其中一个是另一个的剪裁。现在我想围绕剪切矩形的中心旋转较大的矩形并调整x / y值。 如何计算旋转后的新x/y值? 我只想绕着小盒子的中心旋转大盒子的x/y。因此,较大盒子的x/y点相对于较小盒子的顶部/左侧点。我有小盒子的宽度和高度,所以我可以计算大盒子相对于小盒子中心的x/y点。旋转的角度以度为单位。旋转可以是任何角度,例如10度。

    • 问题内容: 我正在尝试使三个对象绕一个圆旋转。到目前为止,我已经能够使一个对象绕圆旋转。如果不弄乱代码,我将一无所获。谁能建议最好的方法来做到这一点?这是代码的一部分。谢谢! 问题答案: jQuery解决方案,适用于任意数量的外部项目。

    • 我现在正在写一个小游戏,我遇到了一个问题。我需要在一个大圆的边界上画64个小圆。所以我想要这样的东西: 我已经试过很多方法,但都不管用。如何在java中使用java实现这一点。awt。组件#paint()方法和java。awt。图形课? 谢谢

    • 抱歉,因为这是一个垃圾问题,但是我完全不知道最好的方法。我相信一定有一些内在的或常见的做法,但我找不到它,谷歌没有发现任何有价值的东西。 我有一个javafx场景,其中有许多< code >圆圈 (以下命名是为了说明我试图达到的效果) 所有位置: 在 600 x 600 的场景中。 我需要将物体放置在物体周围。我不在乎在哪里,只要它们与月球的距离并且不接触。 我最初循环遍历每个对象,检查冲突并使用

    • 我目前正在尝试绕世界x轴旋转一个位置向量(0,0,1),然后将其旋转回其原始位置(只是尝试使其工作)。我阅读了旋转矩阵,并使它工作(排序),但我现在相当卡住了。 如图和代码所示,我在起点(0,0,1)处创建了一个立方体,并将其向下旋转30度。但顺时针旋转时,它的旋转角度似乎超过30度。但是,当我逆时针(30度)旋转它时,它确实旋转了适当的量。这导致它没有在它应该(0,0,1)的起点处结束。 我想知