想象#
VEX EXP 的视觉传感器可以检测并追踪颜色特征和颜色代码。这使得视觉传感器能够分析周围环境并根据检测到的视觉数据做出反应。以下是所有方法的列表:
方法——从视觉传感器获取数据。
takeSnapshot – 捕获特定颜色特征或颜色代码的数据。
largestObject – 立即从快照中选择最大的对象。
objectCount – 以整数返回检测到的物体的数量。
objects – 返回包含检测到的对象属性的数组。
已安装 – 视觉传感器是否连接到 EXP Brain。
属性 – 从 takeSnapshot 返回的对象数据。
.exists – 以布尔值表示该对象是否存在于当前检测中。
.width – 检测到的物体的宽度(以像素为单位)。
.height – 检测到的物体的高度(以像素为单位)。
.centerX – 对象中心的 X 位置(以像素为单位)。
.centerY – 对象中心的 Y 位置(以像素为单位)。
.angle – 颜色代码的方向(以度为单位)。
.originX – 对象左上角的 X 位置(以像素为单位)。
.originY – 对象左上角的 Y 位置(以像素为单位)。
构造函数——手动初始化和配置视觉传感器。
vision – 创建视觉传感器。
vision::signature – 创建颜色签名。
vision::code – 创建颜色代码。
In VEXcode, the initialization of the Vision Sensor and its configured Color Signatures and Color Codes is done automatically. For the examples below, the configured Vision Sensor will be named Vision1
. To manually initialize and construct a Vision Sensor and its Color Signatures and Color Codes, refer to the Constructors section on this page.
方法#
takeSnapshot#
takeSnapshot
captures an image from the Vision Sensor, processes it based on the configured Color Signatures and Color Codes, and updates the objects
array. This method can also limit the amount of objects captured in the snapshot.
必须先在 Vision Utility 中配置 颜色签名 和 颜色代码,然后才能使用此方法。
The objects
array stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. objects
is an empty array if no matching objects are detected.
Default Usage:
Vision1.takeSnapshot(signature)
范围 |
描述 |
---|---|
|
What |
while (true) {
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__BLUEBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If objects were found, print the location.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
}
else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
超载
Vision1.takeSnapshot(signature, count)
过载参数 |
描述 |
---|---|
|
The number of objects to return as a |
重载示例
// Display a location if a blue box is detected
while (true) {
// Take a snapshot of only one object
Vision1.takeSnapshot(Vision1__BLUEBOX, 1);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If object was found, print the location.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
}
else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
色彩签名#
颜色特征是视觉传感器能够识别的独特颜色。这些特征使传感器能够根据物体的颜色检测和跟踪它们。配置颜色特征后,传感器可以识别其视野范围内具有该特定颜色的物体。颜色特征与 take_snapshot 一起使用,可以实时处理和检测彩色物体。
To use a configured Color Signature in a project, its name must be passed as a string in the format: the Vision Sensor’s name, followed by two underscores, and then the Color Signature’s name. For example: vision_1__REDBOX
.
//Display if any objects match the REDBOX signature
while (true) {
// Take a snapshot to check for detected objects.
Brain.Screen.setCursor(1, 1);
Brain.Screen.clearScreen();
// Change to any configured Color Signature
Vision1.takeSnapshot(Vision1__REDBOX);
if (Vision1.objects[0].exists){
Brain.Screen.print("Color signature");
Brain.Screen.newLine();
Brain.Screen.print("detected!");
wait(0.1,seconds);
}
}
颜色代码#
颜色代码是由按特定顺序排列的颜色特征组成的结构化模式。这些代码使视觉传感器能够识别预定义的颜色模式。颜色代码可用于识别复杂物体或为自主导航创建独特的标记。
To use a configured Color Code in a project, its name must be passed as a string in the format: the Vision Sensor’s name, followed by two underscores, and then the Color Code’s name. For example: vision_1__BOXCODE
.
// Display if any objects match the BOXCODE code
while (true) {
// Take a snapshot to check for detected objects.
Brain.Screen.setCursor(1, 1);
Brain.Screen.clearLine(1);
// Change to any configured Color Code
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists){
Brain.Screen.print("Color Code Detected!");
wait(0.1, seconds);
}
}
largestObject#
largestObject
retrieves the largest detected object from the objects
array.
This method can be used to always get the largest object from objects
without specifying an index.
Default Usage:
Vision1.largestObject
while (true){
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__BLUEBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If objects were found, print the location
// of largest.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
}
else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
objectCount#
objectCount
returns the number of items inside the objects
array as an integer.
Default Usage:
Vision1.objectCount
while (true) {
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__BLUEBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// Print how many objects were detected.
Brain.Screen.print("object count: %d", Vision1.objectCount);
wait(0.5, seconds);
}
installed#
installed
returns an integer indicating whether the Vision Sensor is currently connected to the EXP Brain.
1
– The Vision Sensor is connected to the EXP Brain.0
– The Vision Sensor is not connected to the EXP Brain.
参数 |
描述 |
---|---|
该方法没有参数。 |
// Display a message if the Vision Sensor is detected
if (Vision1.installed()){
Brain.Screen.print("Vision Sensor");
Brain.Screen.newLine();
Brain.Screen.print("Installed!");
}
objects#
objects
returns an array of detected object properties. Use the array to access specific property values of individual objects.
Default Usage:
Vision1.objects
特性#
There are eight properties that are included with each object stored in the objects
array after takeSnapshot
is used.
Some property values are based off of the detected object’s position in the Vision Sensor’s view at the time that takeSnapshot
was used. The Vision Sensor has a resolution of 316 by 212 pixels.
.exists#
.exists
returns an integer indicating if the index exists in the objects
array or not.
1
: The index exists.0
: The index does not exist.
// Check if at least one object is detected
while (true) {
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__BLUEBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If an object exists, print its location.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.objects[0].centerX);
}
else {
Brain.Screen.print("No objects detected.");
}
wait(0.5, seconds);
}
.width#
.width
returns the width of the detected object in pixels, which is an integer between 1 and 316.
// Move towards a blue box until its width is
// larger than 100 pixels
while (true){
Vision1.takeSnapshot(Vision1__BLUEBOX);
if (Vision1.objects[0].width < 100) {
Drivetrain.driveFor(forward, 10, mm);
}
else {
Drivetrain.stop();
}
wait(0.5, seconds);
}
.height#
.height
returns the height of the detected object in pixels, which is an integer between 1 and 212.
// Move towards a blue box until its height is
// larger than 100 pixels
while (true){
Vision1.takeSnapshot(Vision1__BLUEBOX);
if (Vision1.objects[0].height < 100) {
Drivetrain.driveFor(forward, 10, mm);
}
else {
Drivetrain.stop();
}
wait(0.5, seconds);
}
.centerX#
.centerX
returns the x-coordinate of the detected object’s center in pixels, which is an integer between 0 and 316.
// Turn slowly until a blue box is centered in
// front of the robot
Drivetrain.setTurnVelocity(10,percent);
Drivetrain.turn(right);
while (true){
Vision1.takeSnapshot(Vision1__BLUEBOX);
if (Vision1.objects[0].exists){
if (140 < Vision1.largestObject.centerX && Vision1.largestObject.centerX < 180){
Drivetrain.stop();
}
}
wait(0.5,seconds);
}
.centerY#
.centerY
returns the y-coordinate of the detected object’s center in pixels, which is an integer between 0 and 212.
// Move towards a blue object until its
// center y-coordinate is more than 140 pixels
while (true){
Vision1.takeSnapshot(Vision1__BLUEBOX);
if (Vision1.objects[0].exists){
if (Vision1.largestObject.centerY < 140){
Drivetrain.drive(forward);
}
}
else{
Drivetrain.stop();
}
wait(0.5,seconds);
}
.angle#
.angle
returns the orientation of the detected object in degrees, which is a double between 0 and 316.
// Turn right or left depending on how the
// configured box code is rotated.
while (true){
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists){
if (70 < Vision1.objects[0].angle && Vision1.objects[0].angle < 110){
Drivetrain.turnFor(right, 45, degrees);
}
else if (250 < Vision1.objects[0].angle && Vision1.objects[0].angle < 290){
Drivetrain.turnFor(left, 45, degrees);
}
else{
Drivetrain.stop();
}
}
wait(0.5,seconds);
}
.originX#
.originX
returns the x-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 316.
// Display if a red box is to the
// left or the right
while (true){
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1,1);
Vision1.takeSnapshot(Vision1__REDBOX);
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
returns the y-coordinate of the top-left corner of the detected object’s bounding box in pixels, which is an integer between 0 and 212.
// Display if a red box is close or far
// from the robot.
while (true){
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1,1);
Vision1.takeSnapshot(Vision1__REDBOX);
if (Vision1.objects[0].exists){
if (Vision1.objects[0].originY < 80){
Brain.Screen.print("Far");
}
else{
Brain.Screen.print("Close");
}
}
wait(0.5,seconds);
}
构造函数#
Constructors are used to manually create vision
, signature
, and code
objects, which are necessary for configuring the Vision Sensor outside of VEXcode. If fewer arguments are provided, default arguments or function overloading should be used in the constructor definition.
For the examples below, the configured Vision Sensor will be named Vision1
, and the configured Color Signature objects, such as Vision1__BLUEBOX
, will be used in all subsequent examples throughout this API documentation when referring to vision
class methods.
Vision Sensor#
vision
creates a Vision Sensor and configures the brightness level and signatures to be used with the sensor.
Default Usage:
vision( int32_t index, uint8_t bright, Args &… sigs )
默认参数 |
描述 |
---|---|
|
视觉传感器连接到的有效 智能端口。 |
|
视觉传感器的亮度值,从 10 到 150。 |
|
// Construct a vision object Vision1 with 1 color
// Vision1__REDBOX.
vision::signature Vision1__REDBOX = vision::signature (1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1);
vision Vision1 = vision (PORT1, 50, Vision1__REDBOX);
while (true) {
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__REDBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If objects were found, print the location.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
} else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
Color Signature#
signature
creates a Color Signature. Up to seven different Color Signatures can be stored on a Vision Sensor at once.
默认用法:
signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)
范围 |
描述 |
---|---|
|
The |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
|
The value from |
要获取创建颜色签名的值,请转到 Vision Utility。配置颜色签名后,从配置窗口复制参数值。
// Construct a vision object Vision1 with two Color
// Signatures, Vision1__REDBOX and Vision1__BLUEBOX.
vision::signature Vision1__REDBOX = vision::signature (1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1);
vision::signature Vision1__BLUEBOX = vision::signature (2, -4479, -3277, -3878,5869, 7509, 6689,2.5, 1);
vision Vision1 = vision (PORT1, 50, Vision1__REDBOX, Vision1__BLUEBOX);
while (true) {
// Take a snapshot to check for detected objects.
Vision1.takeSnapshot(Vision1__BLUEBOX);
// Clear the screen/reset so that we can display
// new information.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
// If objects were found, print the location.
if (Vision1.objects[0].exists) {
Brain.Screen.print("Center X: %d", Vision1.largestObject.centerX);
} else {
Brain.Screen.print("no object");
}
wait(0.5, seconds);
}
Color Code#
Code
creates a Color Code. It requires at least two already defined Color Signatures in order to be used. Up to eight different Color Codes can be stored on a Vision Sensor at once.
默认用法:
code(sig1, sig2)
参数 |
描述 |
---|---|
|
A previously created |
|
A previously created |
// Construct a vision object Vision1 with two Color
// Signatures, Vision1__REDBOX and Vision1__BLUEBOX,
// Alongside a Color Code for a red box to the left of
// a blue box, Vision1__BOXCODE.
vision::signature Vision1__REDBOX = vision::signature (1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1);
vision::signature Vision1__BLUEBOX = vision::signature (2, -4479, -3277, -3878,5869, 7509, 6689,2.5, 1);
vision::code Vision1__BOXCODE = vision::code (Vision1__REDBOX, Vision1__BLUEBOX);
vision Vision1 = vision (PORT1, 50, Vision1__REDBOX, Vision1__BLUEBOX);
// Turn right or left depending on how the
// configured box code is rotated.
while (true){
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists){
if (70 < Vision1.objects[0].angle && Vision1.objects[0].angle < 110){
Drivetrain.turnFor(right, 45, degrees);
}
else if (250 < Vision1.objects[0].angle && Vision1.objects[0].angle < 290){
Drivetrain.turnFor(left, 45, degrees);
}
else{
Drivetrain.stop();
}
}
wait(0.5,seconds);
}
重载
code(sig1, sig2, sig3)
code(sig1, sig2, sig3, sig4)
code(sig1, sig2, sig3, sig4, sig5)
重载参数 |
描述 |
---|---|
|
A previously created |
|
A previously created |
|
A previously created |
// Construct a vision object Vision1 with two Color
// Signatures, Vision1__REDBOX and Vision1__BLUEBOX,
// Alongside a Color Code for a red box to the left of
// a blue box alternating for 5 boxes, Vision1__BOXCODE.
vision::signature Vision1__REDBOX = vision::signature (1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1);
vision::signature Vision1__BLUEBOX = vision::signature (2, -4479, -3277, -3878,5869, 7509, 6689,2.5, 1);
vision::code Vision1__BOXCODE = vision::code (Vision1__REDBOX, Vision1__BLUEBOX, Vision1__REDBOX, Vision1__BLUEBOX, Vision1__REDBOX);
vision Vision1 = vision (PORT1, 50, Vision1__REDBOX, Vision1__BLUEBOX);
// Turn right or left depending on how the
// configured box code is rotated.
while (true){
Vision1.takeSnapshot(Vision1__BOXCODE);
if (Vision1.objects[0].exists){
if (70 < Vision1.objects[0].angle && Vision1.objects[0].angle < 110){
Drivetrain.turnFor(right, 45, degrees);
}
else if (250 < Vision1.objects[0].angle && Vision1.objects[0].angle < 290){
Drivetrain.turnFor(left, 45, degrees);
}
else{
Drivetrain.stop();
}
}
wait(0.5,seconds);
}