เซ็นเซอร์ตรวจจับภาพ#
การแนะนำ#
คลาส vision ใช้สำหรับควบคุมและเข้าถึงข้อมูลจากเซ็นเซอร์ EXP Vision เซ็นเซอร์นี้ตรวจจับและติดตามลายเซ็นสีภายในขอบเขตการมองเห็น ทำให้หุ่นยนต์ของคุณสามารถระบุเป้าหมายและตอบสนองต่อข้อมูลภาพได้แบบเรียลไทม์
เซ็นเซอร์ตรวจจับภาพสามารถตรวจจับวัตถุที่มีลายเซ็นหลายชิ้นพร้อมกัน และให้ข้อมูลต่างๆ เช่น ตำแหน่ง ความกว้าง ความสูง และพิกัดจุดศูนย์กลางของวัตถุ
ตัวสร้างคลาส#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
ตัวทำลายคลาส#
ทำลายวัตถุ vision และปล่อยทรัพยากรที่เกี่ยวข้อง
~vision();
พารามิเตอร์#
พารามิเตอร์ |
พิมพ์ |
คำอธิบาย |
|---|---|---|
|
|
พอร์ตอัจฉริยะที่เชื่อมต่อกับเซ็นเซอร์ตรวจจับภาพ จะเขียนในรูปแบบ |
|
|
ระดับความสว่างของเซ็นเซอร์ตรวจจับภาพ |
|
|
วัตถุ |
ตัวอย่าง#
// 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 จะเป็นเท็จ
1 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับรหัสลายเซ็นที่ระบุ
int32_t takeSnapshot( uint32_t id );
2 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับรหัส
vision::codeที่ระบุไว้int32_t takeSnapshot( code &cc );
3 — ถ่ายภาพสแนปช็อตและค้นหาวัตถุที่ตรงกับ
vision::signatureobject ที่ระบุ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 );
Parameters6 — ถ่ายภาพสแนปช็อตและจัดเก็บเฉพาะวัตถุจำนวนมากที่สุดที่ระบุซึ่งตรงกับวัตถุ
vision::signatureที่ระบุint32_t takeSnapshot( signature &sig, uint32_t count );
พารามิเตอร์ |
พิมพ์ |
คำอธิบาย |
|---|---|---|
|
|
หมายเลขประจำตัวลายเซ็นที่จะใช้ค้นหา |
|
|
การอ้างอิงถึงวัตถุ |
|
|
การอ้างอิงถึงวัตถุ |
|
|
จำนวนวัตถุสูงสุดที่จะตรวจจับ |
ส่งคืนค่า int32_t ซึ่งแสดงถึงจำนวนวัตถุที่ตรงกันที่ตรวจพบ
เซ็นเซอร์ตรวจจับภาพต้องถ่ายภาพก่อนจึงจะสามารถเข้าถึงข้อมูลวัตถุได้
เมื่อระบุค่า
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 Functionsbool installed();
ฟังก์ชันนี้ไม่รับพารามิเตอร์ใดๆ
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 โดยไม่ต้องระบุค่าดัชนี
VisionSensor.largestObject
ส่วนประกอบ |
คำอธิบาย |
|---|---|
|
ชื่อของอินสแตนซ์ 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 เป็นจำนวนเต็ม
VisionSensor.objectCount
ส่วนประกอบ |
คำอธิบาย |
|---|---|
|
ชื่อของอินสแตนซ์ 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
VisionSensor.objects[index].property
ส่วนประกอบ |
คำอธิบาย |
|---|---|
|
ชื่อของอินสแตนซ์ Vision Sensor ของคุณ |
|
ดัชนีของวัตถุในอาร์เรย์ ดัชนีเริ่มต้นที่ |
|
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);
}