เซ็นเซอร์ตรวจจับภาพ#

การแนะนำ#

คลาส vision ใช้สำหรับควบคุมและเข้าถึงข้อมูลจากเซ็นเซอร์ EXP Vision เซ็นเซอร์นี้ตรวจจับและติดตามลายเซ็นสีภายในขอบเขตการมองเห็น ทำให้หุ่นยนต์ของคุณสามารถระบุเป้าหมายและตอบสนองต่อข้อมูลภาพได้แบบเรียลไทม์

เซ็นเซอร์ตรวจจับภาพสามารถตรวจจับวัตถุที่มีลายเซ็นหลายชิ้นพร้อมกัน และให้ข้อมูลต่างๆ เช่น ตำแหน่ง ความกว้าง ความสูง และพิกัดจุดศูนย์กลางของวัตถุ

ตัวสร้างคลาส#

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

ตัวทำลายคลาส#

ทำลายวัตถุ vision และปล่อยทรัพยากรที่เกี่ยวข้อง

~vision();

พารามิเตอร์#

พารามิเตอร์

พิมพ์

คำอธิบาย

index

int32_t

พอร์ตอัจฉริยะที่เชื่อมต่อกับเซ็นเซอร์ตรวจจับภาพ จะเขียนในรูปแบบ PORTxโดยที่ x คือหมายเลขพอร์ต (ตัวอย่างเช่น PORT1)

bright

uint8_t

ระดับความสว่างของเซ็นเซอร์ตรวจจับภาพ

sigs

vision::signature or vision::code objects

วัตถุ vision::signature หรือ vision::code อย่างน้อยหนึ่งรายการเพื่อลงทะเบียนกับเซ็นเซอร์

ตัวอย่าง#

// 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

ฟังก์ชันสมาชิก#

คลาส vision ประกอบด้วยฟังก์ชันสมาชิกต่อไปนี้:

  • takeSnapshot — บันทึกข้อมูลสำหรับลายเซ็นสีหรือรหัสสีที่เฉพาะเจาะจง

  • installed — เซ็นเซอร์การมองเห็นเชื่อมต่อกับ EXP Brain หรือไม่

ในการเข้าถึงข้อมูลวัตถุที่ตรวจพบหลังจากเรียกใช้ takeSnapshot ให้ใช้ Properties ที่มีอยู่

ก่อนเรียกใช้ฟังก์ชันสมาชิก vision ใดๆ จะต้องสร้างอินสแตนซ์ vision ก่อน ดังแสดงด้านล่าง:

/* 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#

จับภาพจากเซ็นเซอร์ตรวจจับภาพ ประมวลผลตามลักษณะเฉพาะ และอัปเดตอาร์เรย์ objects วิธีนี้ยังสามารถจำกัดจำนวนวัตถุที่จับได้ในภาพรวมได้อีกด้วย

อาร์เรย์ objects เก็บวัตถุที่เรียงลำดับจากใหญ่ที่สุดไปเล็กที่สุดตามความกว้าง โดยเริ่มต้นที่ดัชนี 0 สามารถเข้าถึง คุณสมบัติ ของแต่ละวัตถุได้โดยใช้ดัชนี หากไม่พบวัตถุที่ตรงกัน objectCount จะเป็น 0 และ objects[i].exists จะเป็นเท็จ

Available Functions

1 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับรหัสลายเซ็นที่ระบุ

int32_t takeSnapshot( uint32_t id );

2 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับรหัส vision::code ที่ระบุไว้

int32_t takeSnapshot( code &cc );

3 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับ vision::signature object ที่ระบุ

int32_t takeSnapshot( signature &sig );

4 — ถ่ายภาพสแนปช็อตและจัดเก็บเฉพาะวัตถุที่มีจำนวนมากที่สุดตามที่ระบุไว้ซึ่งตรงกับรหัสลายเซ็น

int32_t takeSnapshot( uint32_t id, uint32_t count );

5 — ถ่ายภาพสแนปช็อตและจัดเก็บเฉพาะวัตถุจำนวนมากที่สุดที่ระบุซึ่งตรงกับวัตถุ vision::code ที่ระบุ

int32_t takeSnapshot( code &cc, uint32_t count );

6 — ถ่ายภาพสแนปช็อตและจัดเก็บเฉพาะวัตถุจำนวนมากที่สุดที่ระบุซึ่งตรงกับวัตถุ vision::signature ที่ระบุ

int32_t takeSnapshot( signature &sig, uint32_t count );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

id

uint32_t

หมายเลขประจำตัวลายเซ็นที่จะใช้ค้นหา

cc

code &

การอ้างอิงถึงวัตถุ vision::code ที่มีค่า เพื่อค้นหา

sig

signature &

การอ้างอิงถึงวัตถุ vision::signature ที่ต้องการค้นหา

count

uint32_t

จำนวนวัตถุสูงสุดที่จะตรวจจับ

Return Values

ส่งคืนค่า int32_t ซึ่งแสดงถึงจำนวนวัตถุที่ตรงกันที่ตรวจพบ

Notes
  • เซ็นเซอร์ตรวจจับภาพต้องถ่ายภาพก่อนจึงจะสามารถเข้าถึงข้อมูลวัตถุได้

  • เมื่อระบุค่า count ระบบจะจัดเก็บเฉพาะวัตถุที่ใหญ่ที่สุดที่ตรวจพบ (ไม่เกินจำนวนที่ระบุ) เท่านั้น

ตัวอย่าง

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#

ตรวจสอบว่าเซ็นเซอร์ตรวจจับภาพเชื่อมต่อกับ EXP Brain แล้วหรือไม่

Available Functions
bool installed();

Parameters

ฟังก์ชันนี้ไม่รับพารามิเตอร์ใดๆ

Return Values

ส่งคืนค่าบูลีนที่ระบุว่าเซ็นเซอร์ตรวจจับภาพเชื่อมต่ออยู่หรือไม่:

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

คุณสมบัติ#

การเรียก takeSnapshot จะอัปเดตผลการตรวจจับของเซ็นเซอร์วิชั่น แต่ละสแนปช็อตจะรีเฟรชอาร์เรย์ objects ซึ่งมีวัตถุที่ตรวจพบสำหรับลายเซ็นสีหรือรหัสสีที่ร้องขอ

ข้อมูลเซ็นเซอร์การมองเห็นสามารถเข้าถึงได้ผ่านคุณสมบัติของวัตถุที่จัดเก็บไว้ใน Vision1.objects[index]โดยที่ index เริ่มต้นที่ 0

ความละเอียดภาพของเซ็นเซอร์ตรวจจับภาพคือ 316 x 212 พิกเซล ตำแหน่งและขนาดของวัตถุจะถูกรายงานในหน่วยพิกเซลโดยอ้างอิงจากมุมมองปัจจุบันของเซ็นเซอร์

ที่พักต่อไปนี้พร้อมให้บริการ:

  • largestObject — เลือกวัตถุที่ตรวจพบขนาดใหญ่ที่สุดจากสแนปช็อตล่าสุด

  • objectCount — ส่งคืนจำนวนวัตถุที่ถูกต้องที่จัดเก็บใน objects.

  • objects — อาร์เรย์ของวัตถุที่ตรวจพบได้รับการอัปเดตโดย takeSnapshot

  • .exists — ตรวจสอบว่ารายการวัตถุมีข้อมูลที่ถูกต้องหรือไม่

  • .width — ความกว้างของวัตถุที่ตรวจพบในหน่วยพิกเซล

  • .height — ความสูงของวัตถุที่ตรวจพบในหน่วยพิกเซล

  • .centerX — ตำแหน่ง X ของจุดศูนย์กลางของวัตถุในหน่วยพิกเซล

  • .centerY — ตำแหน่ง Y ของจุดศูนย์กลางของวัตถุในหน่วยพิกเซล

  • .originX — ตำแหน่ง X ของมุมบนซ้ายของวัตถุในหน่วยพิกเซล

  • .originY — ตำแหน่ง Y ของมุมบนซ้ายของวัตถุในหน่วยพิกเซล

  • .angle — การวางแนวของรหัสสีที่ตรวจพบในหน่วยองศา (ถ้ามี)

largestObject#

ดึงวัตถุที่ใหญ่ที่สุดที่ตรวจพบจากอาร์เรย์ objects

วิธีนี้สามารถใช้เพื่อเลือกวัตถุที่ใหญ่ที่สุดจากวัตถุ objects โดยไม่ต้องระบุค่าดัชนี

Syntax
VisionSensor.largestObject

Components

ส่วนประกอบ

คำอธิบาย

VisionSensor

ชื่อของอินสแตนซ์ Vision Sensor ของคุณ

ตัวอย่าง

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 เป็นจำนวนเต็ม

Syntax
VisionSensor.objectCount

Components

ส่วนประกอบ

คำอธิบาย

VisionSensor

ชื่อของอินสแตนซ์ Vision Sensor ของคุณ

ตัวอย่าง

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

แต่ละองค์ประกอบในอาร์เรย์แสดงถึงวัตถุที่ตรวจพบและให้การเข้าถึงคุณสมบัติของวัตถุนั้น เช่น width, height, centerX และอื่นๆ

วัตถุต่างๆ จะถูกจัดเรียงจากขนาดใหญ่ที่สุดไปเล็กที่สุด (ตามความกว้าง) โดยเริ่มจากดัชนี 0

Syntax
VisionSensor.objects[index].property

Components

ส่วนประกอบ

คำอธิบาย

VisionSensor

ชื่อของอินสแตนซ์ Vision Sensor ของคุณ

index

ดัชนีของวัตถุในอาร์เรย์ ดัชนีเริ่มต้นที่ 0

property

One of the available object properties.

มีอยู่จริง#

.exists

การเข้าถึง

SensorName.objects[index].exists

ค่าที่ส่งคืน

ส่งคืนค่าบูลีนที่ระบุว่าดัชนีวัตถุที่ระบุมีวัตถุที่ตรวจพบที่ถูกต้องหรือไม่:

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

ตัวอย่าง

// 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); 
}

.ความกว้าง#

.width ส่งคืนความกว้างของวัตถุที่ตรวจพบ

การเข้าถึง

SensorName.objects[index].width

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงความกว้างของวัตถุที่ตรวจพบในหน่วยพิกเซล ค่าอยู่ในช่วงตั้งแต่ 1 ถึง 316

ตัวอย่าง

// 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);
}

.ความสูง#

.height ส่งคืนความสูงของวัตถุที่ตรวจพบ

การเข้าถึง

SensorName.objects[index].height

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงความสูงของวัตถุที่ตรวจพบในหน่วยพิกเซล ค่าที่ได้จะอยู่ในช่วงตั้งแต่ 1 ถึง 212

ตัวอย่าง

// 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 ตรวจพบ

การเข้าถึง

SensorName.objects[index].centerX

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงพิกัด x ของจุดศูนย์กลางของวัตถุในหน่วยพิกเซล ค่าที่ได้จะอยู่ในช่วงตั้งแต่ 0 ถึง 316

ตัวอย่าง

// 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 ตรวจพบ

การเข้าถึง

SensorName.objects[index].centerY

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงพิกัด y ของจุดศูนย์กลางของวัตถุในหน่วยพิกเซล ค่าที่ได้จะอยู่ในช่วงตั้งแต่ 0 ถึง 212

ตัวอย่าง

// 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 จะส่งคืนค่าพิกัด x ของมุมบนซ้ายของกรอบล้อมรอบวัตถุที่ตรวจพบ

การเข้าถึง

SensorName.objects[index].originX

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงพิกัด x ของมุมบนซ้ายของกรอบล้อมรอบวัตถุในหน่วยพิกเซล ค่าอยู่ในช่วงตั้งแต่ 0 ถึง 316

ตัวอย่าง

// 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); 
}

.originY#

.originY จะส่งคืนค่าพิกัด y ของมุมบนซ้ายของกรอบล้อมรอบวัตถุที่ตรวจพบ

การเข้าถึง

SensorName.objects[index].originY

ค่าที่ส่งคืน

ส่งคืนค่าจำนวนเต็ม int ที่แสดงพิกัด y ของมุมบนซ้ายของกรอบล้อมรอบวัตถุในหน่วยพิกเซล ค่าที่ได้จะอยู่ในช่วงตั้งแต่ 0 ถึง 212

ตัวอย่าง

// 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);
}

.มุม#

.angle ส่งคืนทิศทางของรหัสสีที่ตรวจพบ

การเข้าถึง

SensorName.objects[index].angle

ค่าที่ส่งคืน

ส่งคืนค่า double ซึ่งแสดงถึงทิศทางของรหัสสีที่ตรวจพบในหน่วยองศา ค่าที่ได้จะอยู่ในช่วงตั้งแต่ 0 ถึง 359.9

ตัวอย่าง

// 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);
}