首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV错误:断言在contourArea中失败(contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S))

OpenCV错误:断言在contourArea中失败(contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S))
EN

Stack Overflow用户
提问于 2018-05-02 18:01:54
回答 1查看 646关注 0票数 0

这是虚拟更衣室的代码,所以运行这个代码基本上使用了ubuntu12.04,python2.7.3,gtk2和opencv2。它可以删除背景屏幕,检测几乎任何光线条件下的T恤,取代T恤color.It是为了取代衬衫和衬衫上的设计.It适用于绿色背景下的蓝色衬衫。

在运行代码时,我发现了以下错误-

代码语言:javascript
复制
> **OpenCV Error: Assertion failed (contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S)) in contourArea, file /build/buildd/opencv-2.3.1/modules/imgproc/src/contours.cpp, line 1673**
Traceback (most recent call last):
  File "vdr/main.py", line 179, in display_frame
    self.final=self.getOutput_frames()
  File "vdr/main.py", line 224, in getOutput_frames
    res=self.replace.replace_design(cntr,self.p_mat, self.design_template, res)
  File "vdr/color_replace.py", line 49, in replace_design
    area.append(cv2.contourArea(cntr[i].astype('int')))
cv2.error: /build/buildd/opencv-2.3.1/modules/imgproc/src/contours.cpp:1673: error: (-215) contour.checkVector(2) >= 0 && (contour.depth() == CV_32F || contour.depth() == CV_32S) in function contourArea

在代码中,在检测T恤的轮廓时有一些问题。

getOutput_frames的main.py代码如下所示-

代码语言:javascript
复制
        def getOutput_frames(self):
            if TEST_MODE:
               _,frame=self.vid.read() #NOTE: Testing without camera. uncomment this to feed from camera.
            else:
                frame=self.v.outFrame() #NOTE: feeding from Camera.

            self.norm.getRGB(frame) #input to Normalized RGB

            norm_rgb=self.norm.normalized() #normalized RGB
            print 'Got normalized RGB '       
            rgb_planes=self.v.imagePlanes(norm_rgb)

            self.back.loadBackground()
            self.back.getFrames(rgb_planes[1])
            self.back.subtract_back(norm_rgb)

            subtracted=self.back.remove(frame)
            print 'background subtracted now'

            self.tshirt.getFrames(norm_rgb)
            mask,cntr=self.tshirt.detect_shirt()
            print 'found tshirt'

            self.replace.getFrames(subtracted,mask)

            res=self.replace.replace_color(self.color)

            if self.design is not 7:
                res=self.replace.replace_design(cntr,self.p_mat, self.design_template, res)

            #replace.replace_design(cntr, p_mat,design_template,res)

            #cv2.imshow("subtracted", res)

            return res

在tshirt.py中检测衬衫的代码如下所示-

代码语言:javascript
复制
    def detect_shirt(self):


              #self.dst=cv2.inRange(self.norm_rgb,np.array([self.lb,self.lg,self.lr],np.uint8),np.array([self.b,self.g,self.r],np.uint8))
             self.dst=cv2.inRange(self.norm_rgb,np.array([20,20,20],np.uint8),np.array([255,110,80],np.uint8))
            cv2.threshold(self.dst,0,255,cv2.THRESH_OTSU+cv2.THRESH_BINARY)
            fg=cv2.erode(self.dst,None,iterations=2)
            #cv2.imshow("fore",fg)  
            bg=cv2.dilate(self.dst,None,iterations=3)
            _,bg=cv2.threshold(bg, 1,128,1)
            #cv2.imshow("back",bg)

            mark=cv2.add(fg,bg)
            mark32=np.int32(mark)
            cv2.watershed(self.norm_rgb,mark32)
            self.m=cv2.convertScaleAbs(mark32)
            _,self.m=cv2.threshold(self.m,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
            #cv2.imshow("final_tshirt",self.m)

           cntr,h=cv2.findContours(self.m,cv2.cv.CV_RETR_EXTERNAL,cv2.cv.CV_CHAIN_APPROX_SIMPLE)


            return self.m,cntr

在color_replace.py中,replace_design的代码如下

代码语言:javascript
复制
         def replace_design(self,cntr,p_mat,design_template,input_image):
                area=list()

                for i in range(len(cntr)):

                    area.append(cv2.contourArea(cntr[i].astype('int')))

                max_area=max(area)

                for i in range(len(area)):
                    if max_area==area[i]:
                        index=i
                mom=cv2.moments(cntr[index].astype('int'))
                #print mom
                x=mom['m10']
                y=mom['m01']
                cx=int(x/max_area)
                cy=int(y/max_area)
                #print 'center-X',cx
                #print 'center-Y',cy

                rect=cv2.boundingRect(np.array(cntr[index],np.float32))

                x=rect[0]
                y=rect[1]
                w=rect[2]
                h=rect[3]

                q=np.array([
                            [x+w/3,(y+h)/3],
                            [x+w/2,(y+h)/3],
                            [x+w/2,y+h/3],
                            [x+w/3,y+h/3]
                       ],np.float32)


                mat=cv2.getPerspectiveTransform(p_mat,q)

                   dst=cv2.warpPerspective(design_template,mat(config.width,config.height))


                temp=cv2.cvtColor(input_image,cv2.cv.CV_BGR2BGRA)
                temp=cv2.addWeighted(temp,1.0,dst,1.0,1.0)       
                res=cv2.cvtColor(temp,cv2.cv.CV_BGRA2BGR)

                return res 

你能帮我解决这个错误吗?完整的代码可以在entire Code of virtual dressing room上找到

EN

回答 1

Stack Overflow用户

发布于 2018-05-02 20:29:35

这个错误告诉你传递的列表或者是空的,或者不是int/float。然后,解决方案是:

1)检查空列表->如果它们是轮廓的后处理,则可能会发生这种情况。我认为如果它不变是不可能的。

2)列表必须是int或float。通常情况下,np.int32依赖于numpy类型,所以使用astype可能会更好。此外,如果它不是从findContours函数更改而来的,则根本不需要它作为类型。它们已经是int值了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50131912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档