0

私のコードはかなり長いので、コードをより便利にするために凝縮するのに助けが必要です。私が持っているコードは、私がフルークロボットで実行するように命令した一連の命令を実行することを想定しています。私はPythonを使用しています。ロボットは、センサーを使用して次のコードを実行することを想定しています。私はそれを凝縮する助けが必要です。

編集:

私のコード:

from Myro import *
from Graphics import *
init('/dev/tty.IPRE6-366079-DevB')

def markYellow(pic):
    for pix in getPixels(pic):
        r = getRed(pix)
        g = getGreen(pix)
        b = getBlue(pix)
        if r > 200 and b < 90 and g > 150:
            setRed(pix,255)
            setGreen(pix,255)
            setBlue(pix,255)
        else:
            setRed(pix,0)
            setGreen(pix,0)
            setBlue(pix,0)

def pctMarked(pic):
    totalPixels = 0
    whitePixels = 0
    for pix in getPixels(pic):
        if getRed(pix) == 255:
            whitePixels = whitePixels + 1
        totalPixels = totalPixels + 1
    result = whitePixels / float(totalPixels)
    return result


def findAvgX(pic):
    pixelCount  = 0
    totalXCount = 0
    for pix in getPixels(pic):
        if getRed(pix) == 255:
            x = getX(pix)
            totalXCount = totalXCount + x
            pixelCount = pixelCount + 1
    avgX = totalXCount / float( pixelCount)
    return avgX


def turn():
    findAvgX(pic)
    if wallLocation <= 85:
        turnLeft(1,0.25)
    elif ballLocation >= 170:
        turnRight(1,0.25)


def celebrate():
    move(0.25,1)
    beep(1,800)
    beep(1,1600)
    beep(1,800)
    stop()

def main():
    p = takePicture()
    markYellow(p)
    pctMarked(p)
    while pctMarked(pic) < 0.2: 
        rotate(1,1)
        p = takePicture()
        markYellow(p)
        pctMarked(p)
    turn()
    while getObstacle('center')> 1000: # I'm not sure about the number. We can test it tomorrow
        forward(1,1)
    celebrate()
4

2 に答える 2

5
# helper functions
def getRGB(pix):
    return getRed(pix), getGreen(pix), getBlue(pix)

def setRGB(pix, r, g, b):
    setRed(pix,r)
    setGreen(pix,g)
    setBlue(pix,b)

def markYellow(pic):
    for pix in getPixels(pic):
        r, g, b = getRGB(pix)
        if r > 200 and b < 90 and g > 150:
            setRGB(pix, 255, 255, 255) 
        else:
            setRGB(pix, 0, 0, 0)

def pctMarked(pic):
    # is there a more direct way to get the totalPixels?
    # totalPixels = len(pic) # perhaps?
    totalPixels = sum(1 for pix in getPixels(pic))
    whitePixels = sum(getRGB(pix) == (255, 255, 255) for pix in getPixels(pic))
    return whitePixels / float(totalPixels)
于 2012-11-01T02:07:07.990 に答える
1

この実装は、ピクセルを置き換えるARGB場合、ピクセルがあるという考えに基づいて機能します。RGB

0xFFFFFFFF0xFFFFFF

私がしていることはこれです:

pixel = A R G B
A = 2 bytes
R = 2 bytes
G = 2 bytes
B = 2 bytes

つまり、16進数では次のようになります。

pixel = 0xFF000000; # black
pixel = 0xFFFFFFFF; # white

AFF透明性を持たないためには(255)でなければなりません。

私はこのコードで仮定をしていることを言及する必要があります。つまり、ピクセルは32ビット整数の形式です。


def markYellow(pic):
    for pix in getPixels(pic):
        if getRed(pix) > 200 and getBlue(pix) < 90 and getGreen(pix) > 150:
            pix = 0xFFFFFFFF;
        else:
            pix = 0xFF000000;

def pctMarked(pic):
    totalPixels = 0
    whitePixels = 0
    for pix in getPixels(pic):
        if pix == 0xFFFFFFFF:
            whitePixels += 1
        totalPixels += 1
    return whitePixels / float(totalPixels)

コメントのカップル:
あなたpcMarkedは白を見つけるために赤だけを見ていました、これはそれがすべての完全に赤い色を拾うことを意味しました。関数は、ピクセルを黄色ではなく白にします
markyellow

于 2012-11-01T02:09:32.960 に答える