Ejemplo n.º 1
0
    def process(self, inframe, outframe):
        inimg = inframe.get()
        self.timer.start()

        imgbgr = jevois.convertToCvBGR(inimg)
        h, w, chans = imgbgr.shape
        outimg = outframe.get()
        outimg.require("output", w, h + 12, jevois.V4L2_PIX_FMT_YUYV)
        jevois.paste(inimg, outimg, 0, 0)
        jevois.drawFilledRect(outimg, 0, h, outimg.width, outimg.height - h,
                              jevois.YUYV.Black)
        inframe.done()

        cube = self.detect(imgbgr, outimg)
        # Load camera calibration if needed:
        # if not hasattr(self, 'camMatrix'): self.loadCameraCalibration(w, h)

        if cube is not None:
            jevois.sendSerial(cube.toJson())

        # Write frames/s info from our timer into the edge map (NOTE: does not account for output conversion time):
        fps = self.timer.stop()
        jevois.writeText(outimg, fps, 3, h - 10, jevois.YUYV.White,
                         jevois.Font.Font6x10)
        outframe.send()
Ejemplo n.º 2
0
    def process(self, inframe, outframe):
        # Get the next camera image (may block until it is captured). To avoid wasting much time assembling a composite
        # output image with multiple panels by concatenating numpy arrays, in this module we use raw YUYV images and
        # fast paste and draw operations provided by JeVois on those images:
        inimg = inframe.get()

        # Start measuring image processing time:
        self.timer.start()

        # Convert input image to BGR24:
        imgbgr = jevois.convertToCvBGR(inimg)
        h, w, chans = imgbgr.shape

        # Get pre-allocated but blank output image which we will send over USB:
        outimg = outframe.get()
        outimg.require("output", w * 2, h + 12, jevois.V4L2_PIX_FMT_YUYV)
        jevois.paste(inimg, outimg, 0, 0)
        jevois.drawFilledRect(outimg, 0, h, outimg.width, outimg.height - h,
                              jevois.YUYV.Black)

        # Let camera know we are done using the input image:
        inframe.done()

        # Get a list of quadrilateral convex hulls for all good objects:
        hlist = self.detect(imgbgr, outimg)

        # Load camera calibration if needed:
        if not hasattr(self, 'camMatrix'): self.loadCameraCalibration(w, h)

        # Map to 6D (inverse perspective):
        (rvecs, tvecs) = self.estimatePose(hlist)

        # Send all serial messages:
        self.sendAllSerial(w, h, hlist, rvecs, tvecs)

        # Draw all detections in 3D:
        self.drawDetections(outimg, hlist, rvecs, tvecs)

        # Write frames/s info from our timer into the edge map (NOTE: does not account for output conversion time):
        fps = self.timer.stop()
        jevois.writeText(outimg, fps, 3, h - 10, jevois.YUYV.White,
                         jevois.Font.Font6x10)

        # We are done with the output, ready to send it to host over USB:
        outframe.send()
Ejemplo n.º 3
0
    def process(self, inframe, outframe):
        # Get the next camera image (may block until it is captured). To avoid wasting much time assembling a composite
        # output image with multiple panels by concatenating numpy arrays, in this module we use raw YUYV images and
        # fast paste and draw operations provided by JeVois on those images:
        inimg = inframe.get()

        # Start measuring image processing time:
        self.timer.start()

        # Convert input image to BGR24:
        imgbgr = jevois.convertToCvBGR(inimg)
        h, w, chans = imgbgr.shape

        # Get pre-allocated but blank output image which we will send over USB:
        outimg = outframe.get()
        outimg.require("output", w * 2, h + 12, jevois.V4L2_PIX_FMT_YUYV)
        #outimg.require("output", w, h + 12, jevois.V4L2_PIX_FMT_YUYV)
        jevois.paste(inimg, outimg, 0, 0)
        jevois.drawFilledRect(outimg, 0, h, outimg.width, outimg.height - h,
                              jevois.YUYV.Black)

        # Let camera know we are done using the input image:
        inframe.done()

        # Get a list of quadrilateral convex hulls for all good objects:
        hlist = self.detect(imgbgr, outimg)

        # Load camera calibration if needed:
        if not hasattr(self, 'camMatrix'): self.loadCameraCalibration(w, h)

        # Map to 6D (inverse perspective):
        (rvecs, tvecs) = self.estimatePose(hlist)

        # Average Values
        for i in range(len(tvecs)):
            for k in range(len(tvecs[i])):
                self.tsum[k].append(tvecs[i][k])
                while (len(self.tsum[k]) > 10):
                    self.tsum[k].pop(0)

        for i in range(len(rvecs)):
            for k in range(len(rvecs[i])):
                self.rsum[k].append(rvecs[i][k])
                while (len(self.rsum[k]) > 10):
                    self.rsum[k].pop(0)

        # Find distance along ground to robot (Y)
        try:
            X = sum(self.tsum[0]) / len(self.tsum[0]) * self.mToFt
            Y = sum(self.tsum[2]) / len(self.tsum[2]) * self.mToFt
            Z = sum(self.tsum[1]) / len(self.tsum[1]) * self.mToFt

            groundDis = -0.2509 + 1.2073 * math.cos(
                self.cameraAngle -
                math.atan(Z / Y)) * math.sqrt(math.pow(Z, 2) + math.pow(Y, 2))
        except:
            groundDis = 0
            X = 0
            Y = 0
            Z = 0

        # Output Average of Target in Feet and Radians
        jevois.writeText(
            outimg, "X: {} Y: {} Angle: {}".format(
                X, groundDis,
                (180 / 3.14) * sum(self.rsum[1]) / len(self.rsum[1])), 3, 0,
            jevois.YUYV.White, jevois.Font.Font6x10)

        # Send all serial messages:
        self.sendAllSerial(w, h, hlist, rvecs, tvecs)

        # Draw all detections in 3D:
        self.drawDetections(outimg, hlist, rvecs, tvecs)

        # Write frames/s info from our timer into the edge map (NOTE: does not account for output conversion time):
        fps = self.timer.stop()
        jevois.writeText(outimg, fps, 3, h - 10, jevois.YUYV.White,
                         jevois.Font.Font6x10)

        # Test Serial Output
        #jevois.sendSerial("{} {}".
        #        format(-1 * self.mToFt, -1 * self.mToFt))

        # We are done with the output, ready to send it to host over USB:
        outframe.send()