от
Мое обнаружение объектный код в формате OpenCV работает хорошо в течение приблизительно половины минуты, потом застывает. Когда я переместить объект, на который он должен быть обнаружение вне камеры, окна, показывая кадр (и я предполагаю, что код хорошо) разморозился, пока мне принесут объект обратно в камеру, вид (он тут же замерзает снова, если он признает объект). У меня есть последовательная связь подключили из скрипта в формате OpenCV для Arduino, который управляет моторами, что ориентировать камеру так, чтобы объект я обнаружил перемещается к центру камеры POV. Я думал, что это может быть связано с обработкой, так что я избавился от .выветривать() и .расширяются (команды), но это ничего не изменит. Похоже, что код будет замерзать, когда цвет маски делается или, когда контуры в розыске.
========python code==========
import cv2
import numpy
import serial
import time

ser=serial.Serial("COM11", 9600) #open serial port

def nothing(x):
    pass

capture=cv2.VideoCapture(0)

while capture.isOpened:

    lower_hsv=numpy.array([60, 90, 116]) #hsv values set so that it only sees a certain shade of blue
    upper_hsv=numpy.array([125, 251, 255])

    ret, frame=capture.read()
    blur=cv2.GaussianBlur(frame, (5,5), 0) #blurs the BGR
    hsv=cv2.cvtColor(blur,cv2.COLOR_BGR2HSV) #changes blurred BGR to HSV

    mask=cv2.inRange(hsv, lower_hsv, upper_hsv)
    mask=cv2.erode(mask, None, iterations=2)
    mask=cv2.dilate(mask, None, iterations=2)

    contours,_=cv2.findContours(mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    if len(contours)>0:
        for contour in contours:
            if cv2.contourArea(contour) < 800:
                continue
            else:
                (x,y), radius=cv2.minEnclosingCircle(contour)
                center=(int(x), int(y))
                radius=int(radius)
                cv2.circle(frame, center, radius, (0, 255, 0), 2)
                print(center)
                if center[0]<300:
                    ser.write('L'.encode()) #if ball is to the left, rotate the motor to the left
                elif center[0]>340:
                    ser.write('R'.encode()) #if ball is to the right, rotate motor to the right
                elif center[1]<220:
                    ser.write('D'.encode()) #if the ball is below, rotate the motor down
                elif center[1]>260:
                    ser.write('U'.encode())
                else:
                    print('not sending anything')

    result=cv2.bitwise_and(frame, frame, mask=mask)

    cv2.imshow('original',frame)

    if cv2.waitKey(1)==27:
        break


cv2.destroyAllWindows()
capture.release()


======arduino code===========
const int motorA_1 = 9;
const int motorA_2 = 10;
const int motorB_1 = 5;
const int motorB_2 = 6;

char inputData;

void setup() {
  // put your setup code here, to run once:

  pinMode(motorA_1, OUTPUT);
  pinMode(motorA_2, OUTPUT);
  pinMode(motorB_1, OUTPUT);
  pinMode(motorB_2, OUTPUT);

  Serial.begin(9600);
  Serial.println("");
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available()>0){
    inputData=Serial.read();
    if (inputData == 'R'){
      digitalWrite(motorA_1,HIGH);
      digitalWrite(motorA_2,LOW);
      delay(10);
    }  
    else if(inputData=='L'){
      digitalWrite(motorA_1,LOW);
      digitalWrite(motorA_2,HIGH);
      delay(10);
    }
    else if(inputData=='U'){
      digitalWrite(motorB_1,HIGH);
      digitalWrite(motorB_2,LOW);
      delay(10);
    }
    else if(inputData=='D'){
      digitalWrite(motorB_1,LOW);
      digitalWrite(motorB_2,HIGH);  
      delay(10);
    }
  }
  else{
    doNothing();
  }
}

void doNothing(){
  Serial.println("doing nothing");
  digitalWrite(motorA_1, LOW);
  digitalWrite(motorA_2, LOW);
  digitalWrite(motorB_1, LOW);
  digitalWrite(motorB_2, LOW);
  delay(20);
Я хочу, чтобы запустить сценарий, пока я не завершить его нажатием кнопки "Esc", но она падает, если я запустить его в течение более чем 30 секунд.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.
...