Skip to content
Gabriel Burnworth edited this page Mar 9, 2017 · 11 revisions

Input

Image

File

Pass in an image as the first argument when running PlantDetection.py or PlantDetection.py --GUI or use the default test image soil_image.jpg.

Call PlantDetection() with the image and/or calibration_img keyword argument as an image filename or an OpenCV/Numpy image object.

Testing Tip: Try using the test images in the PD directory.

Camera

Call PlantDetection() without providing the image and/or calibration_img keyword arguments and a photo will be taken by an attached USB camera and processed.

Parameters

Calibration

Required input parameters:

  • Blur (odd integer) example: 5
  • Morph (kernel size) example: 15
  • Hue range [(0 - 179), (0 - 179)] example: [160, 20] will include 0-20 and 160-179
  • Saturation range [(0 - 255), (0 - 255)] example: [50, 255]
  • Value range [(0 - 255), (0 - 255)] example: [50, 255]
  • Calibration object separation (in coordinate units) example: 500
  • Camera offset from coordinate location (in coordinate units) example: [200, 100]

Other input parameters:

  • Calibration objects axis (X or Y): Are the objects to detect parallel with the X or Y axes?
  • Bot origin orientation in image (top left, top right, bottom left, bottom right): Which direction is the bot's origin?
  • Calibration iterations (1 - 5): allows iterative approach to determining camera rotation

Plant Detection

Required input parameters:

  • Blur (odd integer) example: 5
  • Morph (kernel size) example: 15
  • Hue range [(0 - 179), (0 - 179)] example: [30, 90] is green
  • Saturation range [(0 - 255), (0 - 255)] example: [50, 255]
  • Value range [(0 - 255), (0 - 255)] example: [50, 255]

Output

Data

Text

Verbose (verbose=True):

Processing Parameters:
-------------------------
Blur kernel size: 15
Morph kernel size: 6
Iterations: 4
Hue:
        MIN: 30
        MAX: 90
Saturation:
        MIN: 20
        MAX: 255
Value:
        MIN: 20
        MAX: 255
-------------------------

Processing image: /home/gabriel/plant-detection/soil_image.jpg
16 plants detected in image.

2 known plants inputted.
Plants at the following machine coordinates ( X Y ) with R = radius are to be saved:
    (   200   600 ) R = 100
    (   900   200 ) R = 120

14 plants marked for removal.
Plants at the following machine coordinates ( X Y ) with R = radius are to be removed:
    (  1429    41 ) R = 74
    (   608    43 ) R = 82
    (  1260   103 ) R = 3
    (  1214   153 ) R = 62
    (  1374   216 ) R = 14
    (  1286   232 ) R = 62
    (  1369   285 ) R = 14
    (  1039   412 ) R = 74
    (  1532   479 ) R = 81
    (   766   500 ) R = 80
    (  1309   608 ) R = 149
    (    59   677 ) R = 61
    (    63   914 ) R = 82                                                                                                                             
    (   773    84 ) R = 20                                                                                                                             
                                                                                                                                                       
1 plants marked for safe removal.                                                                                                                      
Plants at the following machine coordinates ( X Y ) with R = radius were too close to the known plant to remove completely:                            
    (   838    86 ) R = 81                                                                                                                             
                                                                                                                                                       
2 detected plants are known or have escaped removal.                                                                                                   
Plants at the following machine coordinates ( X Y ) with R = radius have been saved:                                                                   
    (   901   189 ) R = 65                                                                                                                             
    (   236   579 ) R = 91

Condensed:

Calibration complete. (rotation:0.0, scale:1.7182)                                                                                                     
16 plants detected in image.                                                                                                                           
known plants input: [{'y': 600, 'x': 200, 'radius': 100}, {'y': 200, 'x': 900, 'radius': 120}]                                                         
parameters input: {'morph': 6, 'H': [30, 90], 'blur': 15, 'S': [20, 255], 'iterations': 4, 'V': [20, 255]}                                             
coordinates input: [600, 400]

Print all JSON (print_all_json=True):

Input Parameters:

{'morph': 6, 'H': [30, 90], 'blur': 15, 'S': [20, 255], 'iterations': 4, 'V': [20, 255]}

Plants (input and output):

{'known': [{'y': 600, 'x': 200, 'radius': 100}, {'y': 200, 'x': 900, 'radius': 120}], 'save': [{'y': 189.01, 'x': 901.37, 'radius': 65.32}, {'y': 579.04, 'x': 236.43, 'radius': 91.23}], 'safe_remove': [{'y': 85.91, 'x': 837.8, 'radius': 80.52}], 'remove': [{'y': 41.24, 'x': 1428.86, 'radius': 73.59}, {'y': 42.96, 'x': 607.56, 'radius': 82.26}, {'y': 103.1, 'x': 1260.48, 'radius': 3.44}, {'y': 152.92, 'x': 1214.09, 'radius': 62.0}, {'y': 216.5, 'x': 1373.88, 'radius': 13.82}, {'y': 231.96, 'x': 1286.25, 'radius': 61.8}, {'y': 285.23, 'x': 1368.72, 'radius': 14.4}, {'y': 412.37, 'x': 1038.83, 'radius': 73.97}, {'y': 479.38, 'x': 1531.95, 'radius': 80.96}, {'y': 500.0, 'x': 765.64, 'radius': 80.02}, {'y': 608.25, 'x': 1308.59, 'radius': 148.73}, {'y': 676.97, 'x': 59.46, 'radius': 60.95}, {'y': 914.09, 'x': 62.89, 'radius': 82.37}, {'y': 84.2, 'x': 772.51, 'radius': 20.06}]}

Calibration data (input and output):

{'calibration_iters': 3, 'H': [160, 20], 'total_rotation_angle': 0.0, 'center_pixel_location': [465, 290], 'S': [100, 255], 'V': [100, 255], 'calibration_circle_separation': 1000, 'morph': 15, 'coord_scale': 1.7182, 'camera_offset_coordinates': [200, 100], 'image_bot_origin_location': [0, 1], 'blur': 5, 'calibration_circles_xaxis': True}

Files (from_file=True)

plant-detection_inputs.json - Input Parameters see above

plant-detection_plants.json - Plants (input and output) see above

plant-detection_p2c_calibration_parameters.json - Calibration data (input and output) see above

Farmware

If run as a farmware (app=True):

Database (Web App API)

Requests will be made through the FarmBot API to get a list of known plant locations and to upload detected plants to remove.

Settings (FarmBotOS)

Environment variables will be saved with input parameters and calibration data.

Graphics

Options

Circle Plants (circle_plants=True)

soil_image_marked

Draw Contours (draw_contours=True)

soil_image_marked

Clump Buster (clump_buster=True)

soil_image_marked

Grey Out Background (grey_out=True)

soil_image_marked real_soil_image_3_marked

Grid (included if detected plant coordinates are requested and calibration data has been provided)

real_soil_image_3_marked

Images

Result

Without calibration:

soil_image_marked

With calibration: (coordinates=True)

soil_image_marked

Debug (debug=True)

Blurred

soil_image_blurred

Masked (using HSV range)

soil_image_masked

Masked (showing original image)

soil_image_masked2

Morphed (using morph and iterations)

soil_image_morphed

Morphed (showing original image)

soil_image_morphed2

Contours (plant boundaries)

soil_image_contours

Contours (with original image)

soil_image_coordinates_found

Array Input Results (Morphed with original image)

soil_image_morphed2