如何使用opencv python填充多边形

2024-06-16 10:24:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用白色填充这些多边形,这个操作在整个图像上循环,所以我想知道在python中使用opencv执行这个操作的语法和函数 这是我的输入图像

enter image description here

alist=[]
img = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)
imo = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)
imr = cv2.imread('closing2.jpg',cv2.IMREAD_GRAYSCALE)*0
imac = imr
height , width  = imo.shape[:2]
a,im = cv2.threshold(img,200,255,cv2.THRESH_BINARY)
# i=100
# p=[i,i]
points = []
for j in range(0,1000,50):
    for i in range(0,1000,50):
        p=[i,j]
        poly = raypoly(im,p,5)
        st = metrics(p,poly)

        polyc=raypolyLimit(im,p,st,30)
        # print(polyc)
        # print(len(polyc))
        # for m in range(len(polyc)):
        #     point = polyc[m]
        #     cv2.fillConvexPoly(im, point, 255)
        plotpoly(polyc,imr)

        plotpolypoints(polyc,imr,255,1)
        # plotray(im,p,imr)

        am = polyArea(polyc)
        # print(am)
        if am > 5:
            alist.append(am)
            # img[(i-5):(i+5),(j-5):(j+5)]=150
            # plt.imshow(imf)
            # plt.show()
        imo = im * 0
        plotpoly(polyc,imo)
        plotpoly(polyc, im)
        # plotArea(polyc,imo)
        imf = imo*1000 +im
        a,imf = cv2.threshold(imf,100.0,255.0,cv2.THRESH_BINARY)
        cv2.imshow('Frame_1', imr)
        cv2.imshow('Frame_3', imo)
        cv2.imshow('Frame_4', imf)
        cv2.imshow('Frame_5', im)
        cv2.waitKey(1)

我使用了以下函数,结果如下:

^{pr2}$

但我的问题是,在一定数量的多边形之后,它会给整个图像一个白色的闪光,我不知道如何修复它。在

enter image description here


Tags: 图像imgamcv2framejpgimshowim
1条回答
网友
1楼 · 发布于 2024-06-16 10:24:59

考虑到你已经完成了90%,我当然不会马上去做。我将继续保持您当前的实施策略,至少现在是这样

但是,当开发人员选择在应用程序的不同层重用相同的模型类时,这恰恰是他们陷入的陷阱之一。当你想引进一项新技术或在较低的层次上进行根本性的改变时,位于其上的所有层都会受到影响。这将导致严重的下游技术债务,应该避免

简单的、基于原型的应用程序当然可以避免这种类型的代码重用,但是更复杂的、复杂的应用程序不应该因为我上面提到的原因而这样做

您可以做的是重构代码,以便在应用程序的各个层之间有越来越清晰的边界。理想情况如下:

  • 持久性模型(这些是您的@Entity类)
  • 域模型(这些是您的服务作为输入并作为输出返回的内容)
  • 查看模型(这些是控制器作为输入并作为输出返回的对象)

然后,每个层将包含一些映射代码,这些代码知道如何将一种模型类型转换为下一种模型类型,如下所示:

  • 控制器获取视图模型并将其映射到域模型
  • 控制器使用您的域模型调用服务
  • 服务使用域模型调用存储库
  • 存储库获取域模型并将其映射到持久性模型
  • 存储库使用持久性模型调用Hibernate

许多人可能认为这是不必要的抽象,正如我指出的,在简单和基本的用例中,这是正确的。但这里的好处是,当您开始像这样分离层时,可以避免层之间不必要的内聚

至少,它值得在视图模型和持久性模型之间进行划分。这允许您在最有意义的地方对数据存储的结构进行建模,同时允许选择完全不同的公开REST接口。通过这种方式,当需求在频谱的两端发生变化时,他们可以自由地这样做,而只需要处理位于它们之间的映射代码

相关问题 更多 >