是否有可能相同的代码返回与openCV不同的结果?

时间:2018-05-08 14:30:18

标签: opencv raspberry-pi mask

我在python上使用openCV正在运行Raspberry-Pi计划。

我非常怀疑OpenCV Error。它看起来一定不会发生,但确实发生了。

简而言之,mask cv2.inRange()image歪曲的情况与images相同。

我的代码的简单结构:

  1. mask处理到mask并计算其准确性。
  2. 如果mask没有聚集在(1.)中,这意味着image的{​​{1}}全部为黑色(空)np.array,则会跳过{exception: Value Error的迭代1}} 命令。(因为代码中的min(empty np.array) Value Error。)
  3. 以时间间隔迭代(1.~2。)。
  4. 问题:

    我已经超过两周了OpenCV Error。这是因为代码中的某些parameters被赋予了错误的值。此paramters主要根据mask裁剪的image计算得出。所以我在迭代过程中保存了所有imagemask s。并且发现mask

    中不得有微小的9th iteration

    问题是当我厌倦了在我的labtop上手动裁剪mask同一9 th image时,它没有mask这意味着只有空(黑色)mask 。但是在mask的迭代运行中,有一个非常小的Raspberry-Pi(白色区域)。

    我已经检查过labtop和R-Pi中的文件是否存在差异,但两者都相同。 这是images: 首先是输入图像以生成Real实例。第二个是手动创建的mask。 Thired在mask中自动创建R-Pi That <code>image</code> in question manually maden <code>mask</code> made in R-pi <code>mask</code>

    pc和R-Pi之间的区别仅在于:当我在pc中手动运行代码时,我使用了来自image.jpg的已保存SDcard of R-Pi。当代码在R-Pi迭代运行时,image直接从R-pi camera module V2

    中捕获

    我知道这很奇怪,许多人会认为代码中存在拼写错误或错误。但是过去两周我一直在为这个问题而受苦。我需要关于这类问题的任何线索。

    是否有任何可能的情况从openCVR-pi中的相同代码收集到不同的结果?

    这是代码的一部分。 Real实例在循环中迭代创建。发生的行OpenCV Error标有#。如果有人要求,我会上传更多。上传完整代码有点长。

    class Real:  
        __ob_low=np.array([25,100,50]) #27,65,100]) /25,100,50
        __ob_high=np.array([33,255,255]) #[45,255,255]) /33,255,255
    
        def __opening(self, mask):
            kernel = np.ones((7, 1), np.uint8)
            op = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
            return op
    
        def __init__(self, img_got,imgname):
    
            img = img_got
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
            mask_temp = cv2.inRange(hsv, self.__ob_low, self.__ob_high)
            mask = self.__opening(mask_temp)
    
            maskdir = "/home/pi/capstone/mask/" #
            img_name = imgname #
            cv2.imwrite(os.path.join(maskdir,img_name),mask) #
    
            if not (np.any(mask)):
                print("mask is empty")
    
            array1 = np.transpose(np.nonzero(mask))
            array2 = np.nonzero(mask)
    
            ymin=min(array2[1])
            ymax=max(array2[1])
            xmin=min(array2[0])
            xmax=max(array2[0])
    
            self.x = xmax-xmin
            self.y = ymax-ymin
            self.ratio = self.x/self.y
    
            self.img = img
            self.mask = mask[(xmin):(xmax),(ymin):(ymax)]
    

2 个答案:

答案 0 :(得分:0)

这是因为从相机直接捕获的image与保存在磁盘中的image.jpg不同。第一个对cv2.Inrange()更敏感。在保存过程中,image的部分内容会丢失。如果我将文件保存为其他格式,例如.png,则结果会有所不同。

无论如何,要同步R-Pi和labtop,我已更改代码以在.jpg和labtop中使用已保存的R-Pi文件。

答案 1 :(得分:0)

在其他系统上,我的代码出现问题,事实证明,版本3.4.1和3.3.1与裁剪算法产生的结果不同!