Görüntü Sensörü#

giriiş#

vision sınıfı, IQ (2. nesil) Görsel Sensöründen gelen verileri kontrol etmek ve bunlara erişmek için kullanılır. Bu sensör, görüş alanındaki Renk İmzalarını algılar ve izler; bu sayede robotunuz hedefleri belirleyebilir ve görsel bilgilere gerçek zamanlı olarak yanıt verebilir.

Görsel Sensör, aynı anda birden fazla imza nesnesini algılayabilir ve nesne konumu, genişliği, yüksekliği ve merkez koordinatları gibi bilgiler sağlar.

Sınıf Oluşturucuları#

vision(
  int32_t  index,
  uint8_t  bright,
  Args&... sigs );

Sınıf Yıkıcısı#

vision nesnesini yok eder ve ilgili kaynakları serbest bırakır.

~vision();

Parametreler#

Parametre

Tip

Tanım

index

int32_t

Görüntü sensörünün bağlı olduğu akıllı port, PORTxşeklinde yazılır; burada x port numarasıdır (örneğin, PORT1).

bright

uint8_t

Görüntü sensörünün parlaklık seviyesi.

sigs

vision::signature or vision::code objects

Sensöre kaydedilecek bir veya daha fazla vision::signature veya vision::code nesne.

Örnekler#

// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

Üye Fonksiyonları#

vision sınıfı aşağıdaki üye fonksiyonlarını içerir:

  • takeSnapshot — Belirli bir Renk İmzası veya Renk Kodu için verileri yakalar.

  • installed — Görme Sensörünün IQ (2. nesil) Beynine bağlı olup olmadığı.

takeSnapshot çağrıldıktan sonra tespit edilen nesne verilerine erişmek için mevcut Özellikleri kullanın.

Herhangi bir vision üye fonksiyonunu çağırmadan önce, aşağıda gösterildiği gibi bir vision örneği oluşturulmalıdır:

/* This constructor is required when using VS Code.
Vision Sensor configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */


// Create Color Signatures
vision::signature Vision1__REDBOX = vision::signature(
    1,      // signature id
    10121,  // uMin
    10757,  // uMax
    10439,  // uMean
    -1657,  // vMin
    -1223,  // vMax
    -1440,  // vMean
    2.5,    // range
    1 );    // type

vision::signature Vision1__BLUEBOX = vision::signature(
    2,      // signature id
    -4479,  // uMin
    -3277,  // uMax
    -3878,  // uMean
    5869,   // vMin
    7509,   // vMax
    6689,   // vMean
    2.5,    // range
    1 );    // type

// Create a Color Code from two signatures
vision::code Vision1__BOXCODE = vision::code(
    Vision1__REDBOX,  // first signature
    Vision1__BLUEBOX  // second signature
);

// Create the Vision Sensor instance
vision Vision1 = vision(
    PORT1,                  // Smart Port
    50,                     // brightness
    Vision1__REDBOX,        // signature
    Vision1__BOXCODE );     // Color Code

takeSnapshot#

Görüntü sensöründen bir görüntü yakalar, imzaya göre işler ve objects dizisini günceller. Bu yöntem ayrıca anlık görüntüde yakalanan nesne sayısını da sınırlayabilir.

objects dizisi, 0 dizininden başlayarak, genişliğe göre en büyükten en küçüğe doğru sıralanmış nesneleri saklar. Her nesnenin özelliklerine dizini kullanılarak erişilebilir. Eşleşen nesne bulunmazsa, objectCount 0 olur ve objects[i].exists yanlış olur.

Available Functions

1 — Anlık görüntü alır ve belirtilen imza kimliğiyle eşleşen nesneleri arar.

int32_t takeSnapshot( uint32_t id );

2 — Bir anlık görüntü alır ve belirtilen vision::code nesnesiyle eşleşen nesneleri arar.

int32_t takeSnapshot( code &cc );

3 — Bir anlık görüntü alır ve belirtilen vision::signature nesnesiyle eşleşen nesneleri arar.

int32_t takeSnapshot( signature &sig );

4 — İmza kimliğiyle eşleşen nesnelerin yalnızca belirtilen en büyük sayısını içeren bir anlık görüntü alır ve saklar.

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — Belirtilen vision::code nesnesiyle eşleşen nesnelerin yalnızca belirtilen en büyük sayısını içeren bir anlık görüntü alır ve depolar.

int32_t takeSnapshot( code &cc, uint32_t count );

6 — Belirtilen vision::signature nesnesiyle eşleşen nesnelerin yalnızca belirtilen en büyük sayısını içeren bir anlık görüntü alır ve depolar.

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

Parametre

Tip

Tanım

id

uint32_t

Aranacak imza kimlik numarası.

cc

code &

Aranacak vision::code nesnesine bir referans.

sig

signature &

Aranacak vision::signature nesnesine yapılan bir referans.

count

uint32_t

Algılanabilecek maksimum nesne sayısı.

Return Values

Tespit edilen eşleşen nesne sayısını temsil eden int32_t değerini döndürür.

Notes
  • Nesne verilerine erişilebilmesi için önce Görüntü Sensörü bir anlık görüntü almalıdır.

  • count olarak belirtildiğinde, yalnızca tespit edilen en büyük nesneler (belirtilen miktara kadar) saklanır.

Örnek

while (true) {
  // Display if a blue object is detected
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Blue detected");
  } 
  else {
    Brain.Screen.print("No blue");
  }

  wait(0.5, seconds);
}

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

// Display when BOXCODE is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BOXCODE);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Code detected!");
  }
  wait( 100, msec);
}

installed#

Görsel Sensörün IQ (2. nesil) Beynine bağlı olup olmadığını döndürür.

Available Functions
bool installed();

Parameters

Bu fonksiyon herhangi bir parametre almaz.

Return Values

Görüntü sensörünün bağlı olup olmadığını gösteren bir Boolean değeri döndürür:

  • true — The Vision Sensor is connected.
  • false — The Vision Sensor is not connected.

Özellikler#

takeSnapshot çağrısı, Görsel Sensörün algılama sonuçlarını günceller. Her anlık görüntü, istenen Renk İmzası veya Renk Kodu için algılanan nesneleri içeren objects dizisini yeniler.

Görüntü Sensörü verilerine, Vision1.objects[index]depolanan nesnelerin özellikleri aracılığıyla erişilir; burada index , 0 başlar.

Görüntü sensörünün çözünürlüğü 316 x 212 pikseldir. Nesne konumu ve boyut özellikleri, sensörün mevcut görüş alanına göre piksel birimleri cinsinden rapor edilir.

Aşağıdaki özellikler mevcuttur:

  • largestObject — En son anlık görüntüden tespit edilen en büyük nesneyi seçer.

  • objectCount — objects saklanan geçerli nesnelerin sayısını döndürür.

  • objects — takeSnapshot ile güncellenen tespit edilen nesnelerin dizisi.

  • .exists — Nesne girişinin geçerli veri içerip içermediği.

  • .width — Algılanan nesnenin piksel cinsinden genişliği.

  • .height — Tespit edilen nesnenin piksel cinsinden yüksekliği.

  • .centerX — Nesnenin merkezinin piksel cinsinden X konumu.

  • .centerY — Nesnenin merkezinin piksel cinsinden Y konumu.

  • .originX — Nesnenin sol üst köşesinin piksel cinsinden X konumu.

  • .originY — Nesnenin sol üst köşesinin piksel cinsinden Y konumu.

  • .angle — Algılanan Renk Kodunun derece cinsinden yönü (uygulanabilir olduğunda).

largestObject#

objects nesnelik diziden tespit edilen en büyük nesneyi alır.

Bu yöntem, indeks belirtmeden objects her zaman en büyük nesneyi elde etmek için kullanılabilir.

Syntax
VisionSensor.largestObject

Components

Bileşen

Tanım

VisionSensor

Vision Sensor örneğinizin adı.

Örnek

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display the largest detected object's width
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    if (Vision1.objects[0].exists) {
      Brain.Screen.print("%d", Vision1.largestObject.width);
    } 
    wait(0.5, seconds);
  }
}

objectCount#

objects dizi içindeki öğe sayısını tam sayı olarak döndürür.

Syntax
VisionSensor.objectCount

Components

Bileşen

Tanım

VisionSensor

Vision Sensor örneğinizin adı.

Örnek

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  // Display how many blue objects are detected
  while (true) {
    Vision1.takeSnapshot(Vision1__BLUEBOX);

    Brain.Screen.clearScreen();
    Brain.Screen.setCursor(1, 1);

    Brain.Screen.print("Object Count: %d", Vision1.objectCount);

    wait(0.5, seconds);
  }
}

objects#

objects , takeSnapshot’e yapılan en son çağrıdan tespit edilen nesneleri içeren bir dizidir.

Dizideki her bir eleman, tespit edilen bir nesneyi temsil eder ve width, height, centerX ve daha fazlası gibi özelliklerine erişim sağlar.

Nesneler 0 indeksinden başlayarak, genişliklerine göre en büyükten en küçüğe doğru sıralanmıştır.

Syntax
VisionSensor.objects[index].property

Components

Bileşen

Tanım

VisionSensor

Vision Sensor örneğinizin adı.

index

Dizideki nesne indeksi. İndeks 0 başlar.

property

Mevcut nesne özelliklerinden biri.

.vardır#

.exists , belirtilen nesne dizininin geçerli bir tespit edilmiş nesne içerip içermediğini döndürür.

Erişim

SensorName.objects[index].exists

Dönüş Değeri

Belirtilen nesne dizininin geçerli bir tespit edilmiş nesne içerip içermediğini gösteren bir Boolean değer döndürür:

  • true — A valid object exists at the specified index.
  • false — No object exists at the specified index.

Örnek

// Display when a blue object is detected
while (true) {
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.clearLine(1);

  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    Brain.Screen.print("Color detected!");
  }

  wait(100, msec); 
}

.Genişlik#

.width , tespit edilen nesnenin genişliğini döndürür.

Erişim

SensorName.objects[index].width

Dönüş Değeri

Algılanan nesnenin piksel cinsinden genişliğini temsil eden int tamsayı değeri döndürür. Değer 1 ile 316 arasında değişir.

Örnek

// Approach an object until it's at least 100 pixels wide
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists && Vision1.objects[0].width < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);
}

.yükseklik#

.height , tespit edilen nesnenin yüksekliğini döndürür.

Erişim

SensorName.objects[index].height

Dönüş Değeri

Algılanan nesnenin piksel cinsinden yüksekliğini temsil eden int değeri döndürür. Değer 1 ile 212 arasında değişir.

Örnek

// Approach an object until it's at least 100 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists && Vision1.objects[0].height < 100) {
    Drivetrain.driveFor(forward, 10, mm);
  } 
  else {
    Drivetrain.stop();
  }
  wait(0.5, seconds);  // Avoid over-processing
}

.centerX#

.centerX , tespit edilen nesnenin merkezinin x koordinatını döndürür.

Erişim

SensorName.objects[index].centerX

Dönüş Değeri

Nesnenin merkezinin piksel cinsinden x koordinatını temsil eden int tamsayı değeri döndürür. Değer 0 ile 316 arasında değişir.

Örnek

// Turn until an object is directly in front of the sensor
Drivetrain.setTurnVelocity(10, percent);
Drivetrain.turn(right);
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    int centerX = Vision1.largestObject.centerX;
    if (140 < centerX && centerX < 180) {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}

.centerY#

.centerY tespit edilen nesnenin merkezinin y koordinatını döndürür.

Erişim

SensorName.objects[index].centerY

Dönüş Değeri

Nesnenin merkezinin y koordinatını piksel cinsinden temsil eden int tamsayı değeri döndürür. Değer 0 ile 212 arasında değişir.

Örnek

// Approach an object until it's at least 90 pixels tall
while (true) {
  Vision1.takeSnapshot(Vision1__BLUEBOX);

  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].centerY < 90) {
      Drivetrain.drive(forward);
    } else {
      Drivetrain.stop();
    }
  } else {
    Drivetrain.stop();
  }
  wait(50, msec);
}

.originX#

.originX tespit edilen nesnenin sınırlayıcı kutusunun sol üst köşesinin x koordinatını döndürür.

Erişim

SensorName.objects[index].originX

Dönüş Değeri

Nesnenin sınırlayıcı kutusunun sol üst köşesinin x koordinatını piksel cinsinden temsil eden int değerini döndürür. Değer 0 ile 316 arasında değişir.

Örnek

// Display if an object is to the left or the right
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originX < 160) {
      Brain.Screen.print("To the left!");
    }
    else {
      Brain.Screen.print("To the right!");
    }
  }
  wait(0.5, seconds); 
}

.orijinY#

.originY tespit edilen nesnenin sınırlayıcı kutusunun sol üst köşesinin y koordinatını döndürür.

Erişim

SensorName.objects[index].originY

Dönüş Değeri

Nesnenin sınırlayıcı kutusunun sol üst köşesinin y koordinatını piksel cinsinden temsil eden int değerini döndürür. Değer 0 ile 212 arasında değişir.

Örnek

// Display if an object is close or far
while (true) {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Vision1.takeSnapshot(Vision1__BLUEBOX);
  if (Vision1.objects[0].exists) {
    if (Vision1.objects[0].originY < 80) {
      Brain.Screen.print("Far");
    } else {
      Brain.Screen.print("Close");
    }
  }
  wait(0.5, seconds);
}

.açı#

.angle , algılanan Renk Kodunun yönünü döndürür.

Erişim

SensorName.objects[index].angle

Dönüş Değeri

Algılanan Renk Kodunun yönünü derece cinsinden temsil eden double değerini döndürür. Değer 0 ile 359.9 arasında değişir.

Örnek

// Turn left or right depending on how a configured
// Color Code is rotated
while (true) {
  Vision1.takeSnapshot(Vision1__BOXCODE);
  if (Vision1.objects[0].exists) {
    double angle = Vision1.objects[0].angle;
    if (70 < angle && angle < 110) {
      Drivetrain.turnFor(right, 45, degrees);
    }
    else if (250 < angle && angle < 290) {
      Drivetrain.turnFor(left, 45, degrees);
    }
    else {
      Drivetrain.stop();
    }
  }
  wait(0.5, seconds);
}