2016-11-01 2 views
-1

웹 페이지의 코드를 Python 2.7로 복사했지만 성공하지 못했습니다.라즈베리 파이 3의 Opencv와 Python

코드는 다음과 같습니다

# Raspbery Pi Color Tracking Project 
# Code written by Oscar Liang 
# 30 Jun 2013 

import cv2.cv as cv 
import smbus 

bus = smbus.SMBus(1) 
address = 0x04 

def sendData(value): 
bus.write_byte(address, value) 
# bus.write_byte_data(address, 0, value) 
return -1 

def readData(): 
state = bus.read_byte(address) 
# number = bus.read_byte_data(address, 1) 
return state 

def ColorProcess(img): 

# returns thresholded image 
imgHSV = cv.CreateImage(cv.GetSize(img), 8, 3) 

# converts BGR image to HSV 
cv.CvtColor(img, imgHSV, cv.CV_BGR2HSV) 
imgProcessed = cv.CreateImage(cv.GetSize(img), 8, 1) 

# converts the pixel values lying within the range to 255 and stores it in the destination 
cv.InRangeS(imgHSV, (100, 94, 84), (109, 171, 143), imgProcessed) 
return imgProcessed 

def main(): 

# captured image size, change to whatever you want 
width = 320 
height = 240 

capture = cv.CreateCameraCapture(0) 

# Over-write default captured image size 
cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_WIDTH,width) 
cv.SetCaptureProperty(capture,cv.CV_CAP_PROP_FRAME_HEIGHT,height) 

cv.NamedWindow(“output”, 1) 
cv.NamedWindow(“processed”, 1) 

while True: 

frame = cv.QueryFrame(capture) 
cv.Smooth(frame, frame, cv.CV_BLUR, 3) 

imgColorProcessed = ColorProcess(frame) 
mat = cv.GetMat(imgColorProcessed) 

# Calculating the moments 
moments = cv.Moments(mat, 0) 
area = cv.GetCentralMoment(moments, 0, 0) 
moment10 = cv.GetSpatialMoment(moments, 1, 0) 
moment01 = cv.GetSpatialMoment(moments, 0,1) 

# Finding a big enough blob 
if(area > 60000): 

# Calculating the center postition of the blob 
posX = int(moment10/area) 
posY = int(moment01/area) 

# check slave status and send coordinates 
state = readData() 
if state == 1: 
sendData(posX) 
sendData(posY) 
print ‘x: ‘ + str(posX) + ‘ y: ‘ + str(posY) 

# update video windows 
cv.ShowImage(“processed”, imgColorProcessed) 
cv.ShowImage(“output”, frame) 

if cv.WaitKey(10) >= 0: 
break 

return; 

if __name__ == “__main__”: 
main() 
+0

어떤 방법으로 성공하지 못했습니까? 이것을 실행할 때 오류가 발생합니까? 무슨 일이야? – halfer

+0

흠,이 코드가 편집기에서 어떻게 들여 쓰기되어 있다면 들여 쓰기를 수정해야합니다 - Python [들여 쓰기가 필요합니다] (https://docs.python.org/release/2.5.1/ref/) indentation.html). – halfer

+0

예 들여 쓰기 및 기타 기능에 관한 많은 오류가 발생합니다 ... 들여 쓰기를 고정했지만 기능 오류는 없습니다. – ITLover

답변

0

내가 그것을 해결했다. 올바른 코드 :

import cv2.cv as cv 
import smbus 
import cv2 
bus = smbus.SMBus(1) 
address = 0x04 

def sendData(value): 
    bus.write_byte(address, value) 
    return -1 
def readData(): 
    state = bus.read_byte(address) 
    return state 
def ColorProcess(img): 
    imgHSV = cv.CreateImage(cv.GetSize(img) ,8 ,3) 
    cv.CvtColor(img, imgHSV, cv.CV_BGR2HSV) 
    imgProcessed = cv.CreateImage(cv.GetSize(img) ,8 ,1) 
    cv.InRangeS(imgHSV, (100, 94, 84), (109, 171, 143), imgProcessed) 
    return imgProcessed 
def main(): 
    width = 320 
    height = 240 

    capture = cv.CreateCameraCapture(0) 
    cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, width) 
    cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT, height) 
    cv.NamedWindow("output", 1) 
    cv.NamedWindow("processed", 1) 

    while True: 
     frame = cv.QueryFrame(capture) 
     cv.Smooth(frame, frame, cv.CV_BLUR, 3) 
     imgColorProcessed = ColorProcess(frame) 
     mat = cv.GetMat(imgColorProcessed) 
     moments = cv.Moments(mat, 0) 
     area = cv.GetCentralMoment(moments, 0, 0) 
     moment10 = cv.GetSpatialMoment(moments, 1, 0) 
     moment01 = cv.GetSpatialMoment(moments, 0, 1) 

     if (area > 60000): 
      posX = int(moment10/area) 
      posY = int(moment01/area) 
      ali = long(2000000) 

      state = readData() 
      if state == 1: 
       sendData(posX) 
       sendData(posY) 

      print 'x: ' + str(posX) + 'y: ' + str(posY) 

     cv.ShowImage("processed", imgColorProcessed) 
     cv.ShowImage("output", frame) 

     if cv.WaitKey(10) >= 0: 

      break 

    return; 

if __name__ == "__main__": 
     main()