Welcome new user! You can search existing questions and answers without registering, but please register to post new questions and receive answers. Note that due to large amounts of spam attempts, your first three posts will be manually moderated, so please be patient.
We have moved to a new forum at http://jevois.usc.edu, please check it out. The forum at jevois.org/qa will not allow new user registrations but is maintained alive for its useful past questions and answers.
Welcome to JeVois Tech Zone, where you can ask questions and receive answers from other members of the community.

525 questions

591 answers

651 comments

700,813 users

Overwrite the module in JeVois with my coding

0 votes
Hi, I'm new to JeVois. I have a coding that is using the webcam to run but now I am trying to run it on the JeVois Camera. I have no idea how to develop a software to run my coding on JeVois so I decide to use the GUVC software to run my coding. I am now trying to edit the PythonOpenCV module in JeVois and overwrite it with my code because I am gonna using its video mapping to execute my coding in the GUVC software. But the problem is I do not know how to put my coding in the correct sequence in the JeVois module. Anyone can help? Big thanks.

###PythonOpenCV module###

import libjevois as jevois
import cv2
import numpy as np

## Simple example of image processing using OpenCV in Python on JeVois
#
# This module by default simply converts the input image to a grayscale OpenCV image, and then applies the Canny
# edge detection algorithm. Try to edit it to do something else (note that the videomapping associated with this
# module has grayscale image outputs, so that is what you should output).
#
# @author Laurent Itti
#
# @displayname Python OpenCV
# @videomapping GRAY 640 480 20.0 YUYV 640 480 20.0 JeVois PythonOpenCV
# @email itti\@usc.edu
# @address University of Southern California, HNB-07A, 3641 Watt Way, Los Angeles, CA 90089-2520, USA
# @copyright Copyright (C) 2017 by Laurent Itti, iLab and the University of Southern California
# @mainurl http://jevois.org
# @supporturl http://jevois.org/doc
# @otherurl http://iLab.usc.edu
# @license GPL v3
# @distribution Unrestricted
# @restrictions None
# @ingroup modules
class PythonOpenCV:
    # ###################################################################################################
    ## Constructor
    def __init__(self):
        # Instantiate a JeVois Timer to measure our processing framerate:
        self.timer = jevois.Timer("canny", 100, jevois.LOG_INFO)
        
    # ###################################################################################################
    ## Process function with no USB output
    #def process(self, inframe):
    #    jevois.LFATAL("process with no USB output not implemented yet in this module")

    # ###################################################################################################
    ## Process function with USB output
    def process(self, inframe, outframe):
        # Get the next camera image (may block until it is captured) and convert it to OpenCV GRAY:
        inimggray = inframe.getCvGRAY()
        
        # Start measuring image processing time (NOTE: does not account for input conversion time):
        self.timer.start()
        
        # Detect edges using the Canny algorithm from OpenCV:
        edges = cv2.Canny(inimggray, 100, 200, apertureSize = 3)
        
        # Write frames/s info from our timer into the edge map (NOTE: does not account for output conversion time):
        fps = self.timer.stop()
        height, width = edges.shape
        cv2.putText(edges, fps, (3, height - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 255, 1, cv2.LINE_AA)
        
        # Convert our GRAY output image to video output format and send to host over USB:
        outframe.sendCvGRAY(edges)
    
    # ###################################################################################################
    ## Parse a serial command forwarded to us by the JeVois Engine, return a string
    def parseSerial(self, str):
        return "ERR: Unsupported command"
    
    # ###################################################################################################
    ## Return a string that describes the custom commands we support, for the JeVois help message
    def supportedCommands(self):
        return ""

#######################################################################################

###My coding###

#This module is to detect a single line and measure its angle
import cv2
import numpy as np
import math
import time

cap = cv2.VideoCapture(0)
num = 0

#Start video cam
while(True):
    ret,frame = cap.read()
    cv2.imshow("camera",frame)
#Taking a picture
    for num in range (1):
        cv2.imwrite('pic'+str(num)+'.jpg',frame)
        
        num +=1
#Read the picture
    img = cv2.imread('pic0.jpg')
#Crop the picture and save it
    imge = img[100:350,100:300].copy()
    cv2.imwrite('Resize.jpg',imge)
    cv2.waitKey(1)
#Read the cropped picture
    imf = cv2.imread('Resize.jpg')
#Convert to Grayscale
    gray = cv2.cvtColor(imf,cv2.COLOR_BGR2GRAY)
#Canny Edge Detection
    edges = cv2.Canny(gray,50,150,apertureSize = 3)
#Hough Line Transform
    lines = cv2.HoughLines(edges,1,np.pi/180,100)

    if lines is None:
        continue
    for rho,theta in lines[0]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))
#Draw line on the cropped picture
        cv2.line(imf,(x1,y1),(x2,y2),(0,255,0),1)
#Save the cropped picture with line
    cv2.imwrite('houghlines3.jpg',imf)
#Angle measurement formula
    cx = float(x1)
    cy = float(y1)
    cx2 = float(x2)
    cy2 = float(y2)
    angle = int(math.atan2((cy - cy2), (cx2 - cx))* 180 // math.pi)
#Display the angle
    print angle
asked Aug 3, 2017 in Programmer Questions by PY (140 points)
edited Aug 3, 2017 by PY

1 Answer

0 votes

(sorry for the delay as we are just back from vacation)
 

In JeVois, the core software handles wideo capture and video output to USB for you. So you do not need to capture frames anymore. Instead you just write the one process() function of your Python class to get the next input frame and create the next output frame.

Have you looked at this tutorial: http://jevois.org/tutorials/ProgrammerPythonDice.html

It goes through the steps you need to go through (except that in this tutorial we also convert an existing standalone C++ code to Python for JeVois), namely:

- get a skeleton code for your new module

- extract the core algorithm from your existing code, and put it inside the process() function of your JeVois module

Other links to help you

http://jevois.org/doc/Concepts.html

http://jevois.org/doc/ProgrammerPython.html

http://jevois.org/doc/ModulePythonTutorial.html

answered Aug 18, 2017 by JeVois (46,580 points)
...