Skip to content

Commit 3b110f4

Browse files
committed
updated find_color block
1 parent 5567be6 commit 3b110f4

File tree

3 files changed

+21
-14
lines changed

3 files changed

+21
-14
lines changed

camera.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import colorsys
1919
import numpy as np
2020

21-
CAMERA_REFRESH_INTERVAL=0.1
21+
CAMERA_REFRESH_INTERVAL=0.01
2222
MAX_IMAGE_AGE = 0.0
2323
PHOTO_PATH = "./photos"
2424
DEFAULT_IMAGE = "./photos/broken.jpg"
@@ -494,15 +494,21 @@ def find_color(self, s_color):
494494
upper_color = np.array([h+10, 255, 255])
495495
logging.debug("lower: " + str(lower_color) + " upper: " + str(upper_color))
496496
bw = cv2.inRange(img_hsv, lower_color, upper_color)
497-
#contours, hierarchy = bw.find_contours()
498-
contours, hierarchy = cv2.findContours(bw, cv2.cv.CV_RETR_TREE, cv2.cv.CV_CHAIN_APPROX_SIMPLE)
499-
for contour in contours:
500-
(x,y),radius = cv2.minEnclosingCircle(contour)
497+
# get unordered list of contours in filtered image
498+
contours, _ = cv2.findContours(bw, cv2.cv.CV_RETR_LIST, cv2.cv.CV_CHAIN_APPROX_SIMPLE)
499+
center = (0,0)
500+
radius = 0
501+
if not contours is None and len(contours) > 0:
502+
# get the contour with the largest area
503+
largest = sorted(contours, key = cv2.contourArea, reverse=True)[0]
504+
(x,y),radius = cv2.minEnclosingCircle(largest)
501505
center = (int(x), int(y))
502506
radius = int(radius)
507+
# draw a circle around the largest
503508
cv2.circle(img, center, radius, (0,255,0), 2)
504-
self._image_cache = img
505-
self._image_cache_updated = True
509+
# copy to image cache for jpegging and streaming [see run()]
510+
self._image_cache = img
511+
self._image_cache_updated = True
506512
#self.save_image(bw.to_jpeg())
507513
#objects = bw.find_blobs(minsize=5, maxsize=100)
508514
#logging.debug("objects: " + str(objects))
@@ -523,7 +529,7 @@ def find_color(self, s_color):
523529
#self.save_image(img.to_jpeg())
524530
#print "object: " + str(time.time() - ts)
525531
#return [dist, angle]
526-
return [0,0]
532+
return [center[0],center[1],radius*2]
527533

528534

529535
def sleep(self, elapse):

static/js/blockly/blocks.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -706,7 +706,7 @@ Blockly.Blocks['coderbot_adv_findColor'] = {
706706
this.setColour(290);
707707
this.appendDummyInput()
708708
.appendField(Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_FIND)
709-
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_DIST, 'DIST'], [Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_ANGLE, 'ANGLE'],[Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_BOTH,'BOTH']]), 'RETVAL')
709+
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_X, 'X'], [Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_Y, 'Y'],[Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_DIAMETER,'DIAMETER'],[Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_ALL,'ALL']]), 'RETVAL')
710710
.appendField(Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_COLOR);
711711
this.appendValueInput('COLOR')
712712
.setCheck('Colour');
@@ -720,7 +720,7 @@ Blockly.JavaScript['coderbot_adv_findColor'] = function(block) {
720720
// Boolean values true and false.
721721
var color = Blockly.Python.valueToCode(block, 'COLOR', Blockly.Python.ORDER_NONE);
722722
var retval = block.getFieldValue('RETVAL');
723-
var ret_code = {'DIST': '[0]', 'ANGLE': '[1]', 'BOTH': ''}[retval];
723+
var ret_code = {'X': '[0]', 'Y': '[1]', 'DIAMETER': '[2]', 'ALL': ''}[retval];
724724
var code = 'get_cam().find_color(' + color + ')' + ret_code + ';';
725725
return [code, Blockly.Python.ORDER_ATOMIC];
726726
};
@@ -729,7 +729,7 @@ Blockly.Python['coderbot_adv_findColor'] = function(block) {
729729
// Boolean values true and false.
730730
var color = Blockly.Python.valueToCode(block, 'COLOR', Blockly.Python.ORDER_NONE);
731731
var retval = block.getFieldValue('RETVAL');
732-
var ret_code = {'DIST': '[0]', 'ANGLE': '[1]', 'BOTH': ''}[retval];
732+
var ret_code = {'X': '[0]', 'Y': '[1]', 'DIAMETER': '[2]', 'ALL': ''}[retval];
733733
var code = 'get_cam().find_color(' + color + ')' + ret_code;
734734
return [code, Blockly.Python.ORDER_ATOMIC];
735735
};

static/js/blockly/bot_en.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ Blockly.Msg.CODERBOT_SENSOR_FINDSIGNAL = "find signal";
4040
Blockly.Msg.CODERBOT_SENSOR_FINDCODE = "find code";
4141
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_FIND = "find";
4242
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_COLOR = "from color";
43-
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_DIST = "distance";
44-
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_ANGLE = "angle";
45-
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_BOTH = "both";
43+
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_X = "x coord";
44+
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_Y = "ycoord";
45+
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_DIAMETER = "diameter";
46+
Blockly.Msg.CODERBOT_SENSOR_FINDCOLOR_ALL = "x, y, diameter (as list)";
4647
Blockly.Msg.CODERBOT_SENSOR_FINDFACE_X = "x coord";
4748
Blockly.Msg.CODERBOT_SENSOR_FINDFACE_Y = "y coord";
4849
Blockly.Msg.CODERBOT_SENSOR_FINDFACE_SIZE = "size";

0 commit comments

Comments
 (0)