Cảm biến thị giác#
Giới thiệu#
Lớp vision được sử dụng để điều khiển và truy cập dữ liệu từ Cảm biến Thị giác V5. Cảm biến này phát hiện và theo dõi các Dấu hiệu Màu sắc trong tầm nhìn của nó, cho phép robot của bạn xác định mục tiêu và phản hồi thông tin hình ảnh trong thời gian thực.
Cảm biến thị giác có thể phát hiện nhiều đối tượng đặc trưng cùng lúc và cung cấp thông tin như vị trí, chiều rộng, chiều cao và tọa độ tâm của đối tượng.
Hàm tạo lớp#
vision(
int32_t index,
uint8_t bright,
Args&... sigs );
Lớp Destructor#
Phá hủy đối tượng vision và giải phóng các tài nguyên liên quan.
~vision();
Thông số#
Tham số |
Kiểu |
Sự miêu tả |
|---|---|---|
|
|
Cổng thông minh mà Cảm biến thị giác được kết nối, được viết dưới dạng |
|
|
Mức độ sáng của cảm biến thị giác. |
|
|
Một hoặc nhiều đối tượng |
Ví dụ#
// 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
Chức năng thành viên#
Lớp vision bao gồm các hàm thành viên sau:
takeSnapshot— Thu thập dữ liệu cho Chữ ký màu hoặc Mã màu cụ thể.installed— Cảm biến thị giác có được kết nối với bộ não V5 hay không.
Để truy cập dữ liệu đối tượng được phát hiện sau khi gọi takeSnapshot, hãy sử dụng Properties.
Trước khi gọi bất kỳ hàm thành viên nào của vision , cần phải tạo một thể hiện vision , như được hiển thị bên dưới:
/* 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#
Phương pháp này thu thập hình ảnh từ Cảm biến Thị giác, xử lý hình ảnh dựa trên đặc trưng và cập nhật mảng objects Phương pháp này cũng có thể giới hạn số lượng đối tượng được chụp trong ảnh chụp nhanh.
Mảng objects lưu trữ các đối tượng được sắp xếp từ lớn nhất đến nhỏ nhất theo chiều rộng, bắt đầu từ chỉ mục 0. thuộc tính của mỗi đối tượng có thể được truy cập bằng chỉ mục của nó. Nếu không tìm thấy đối tượng phù hợp, objectCount sẽ là 0 và objects[i].exists sẽ là false.
1 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với ID chữ ký được chỉ định.
int32_t takeSnapshot( uint32_t id );
2 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với đối tượng được chỉ định là
vision::code.int32_t takeSnapshot( code &cc );
3 — Chụp ảnh nhanh và tìm kiếm các đối tượng khớp với đối tượng được chỉ định là
vision::signature.int32_t takeSnapshot( signature &sig );
4 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với ID chữ ký.
int32_t takeSnapshot( uint32_t id, uint32_t count );
5 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với đối tượng
vision::codeđược chỉ định.int32_t takeSnapshot( code &cc, uint32_t count );
Parameters6 — Chụp ảnh nhanh và chỉ lưu trữ số lượng đối tượng lớn nhất được chỉ định khớp với đối tượng
vision::signatuređược chỉ định.int32_t takeSnapshot( signature &sig, uint32_t count );
Tham số |
Kiểu |
Sự miêu tả |
|---|---|---|
|
|
Mã số định danh chữ ký cần tìm kiếm. |
|
|
Tham chiếu đến một đối tượng |
|
|
Tham chiếu đến một đối tượng |
|
|
Số lượng tối đa các đối tượng cần phát hiện. |
Trả về một giá trị int32_t biểu thị số lượng đối tượng phù hợp được phát hiện.
Cảm biến thị giác phải chụp ảnh trước khi có thể truy cập dữ liệu đối tượng.
Khi tham số
countđược chỉ định, chỉ những đối tượng được phát hiện lớn nhất (tối đa số lượng được chỉ định) mới được lưu trữ.
Ví dụ
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#
Trả về trạng thái cho biết Cảm biến Thị giác có được kết nối với Bộ xử lý V5 hay không.
Available Functionsbool installed();
Hàm này không nhận tham số nào.
Return ValuesTrả về giá trị Boolean cho biết cảm biến hình ảnh có được kết nối hay không:
-
true— The Vision Sensor is connected. -
false— The Vision Sensor is not connected.
Của cải#
Gọi takeSnapshot cập nhật kết quả phát hiện của Cảm biến Thị giác. Mỗi lần chụp ảnh làm mới mảng objects , chứa các đối tượng được phát hiện cho Chữ ký Màu hoặc Mã Màu được yêu cầu.
Dữ liệu cảm biến thị giác được truy cập thông qua các thuộc tính của các đối tượng được lưu trữ trong Vision1.objects[index], trong đó index bắt đầu tại 0.
Độ phân giải hình ảnh của cảm biến thị giác là 316 x 212 pixel. Vị trí và kích thước của đối tượng được báo cáo bằng đơn vị pixel so với góc nhìn hiện tại của cảm biến.
Các bất động sản sau đây hiện có sẵn:
largestObject— Chọn đối tượng được phát hiện lớn nhất từ ảnh chụp nhanh gần đây nhất.objectCount— Trả về số lượng đối tượng hợp lệ được lưu trữ trongobjects.objects— Mảng các đối tượng được phát hiện được cập nhật bởitakeSnapshot..exists— Liệu mục nhập đối tượng có chứa dữ liệu hợp lệ hay không..width— Chiều rộng của đối tượng được phát hiện tính bằng pixel..height— Chiều cao của đối tượng được phát hiện tính bằng pixel..centerX— Vị trí X của tâm đối tượng tính bằng pixel..centerY— Vị trí Y của tâm đối tượng tính bằng pixel..originX— Vị trí X của góc trên bên trái của đối tượng tính bằng pixel..originY— Vị trí Y của góc trên bên trái của đối tượng tính bằng pixel..angle— Hướng của Mã màu được phát hiện theo độ (nếu có).
largestObject#
Truy xuất đối tượng được phát hiện lớn nhất từ mảng objects.
Phương pháp này có thể được sử dụng để luôn lấy đối tượng lớn nhất từ objects không cần chỉ định chỉ mục.
VisionSensor.largestObject
Thành phần |
Sự miêu tả |
|---|---|
|
Tên của thể hiện Vision Sensor của bạn. |
Ví dụ
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#
Trả về số lượng phần tử bên trong mảng objects dưới dạng số nguyên.
VisionSensor.objectCount
Thành phần |
Sự miêu tả |
|---|---|
|
Tên của thể hiện Vision Sensor của bạn. |
Ví dụ
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 là một mảng chứa các đối tượng được phát hiện từ lần gọi gần đây nhất tới takeSnapshot.
Mỗi phần tử trong mảng đại diện cho một đối tượng được phát hiện và cung cấp quyền truy cập vào các thuộc tính của nó, chẳng hạn như width, height, centerX, và nhiều hơn nữa.
Các đối tượng được sắp xếp từ lớn nhất đến nhỏ nhất (theo chiều rộng), bắt đầu từ chỉ số 0.
VisionSensor.objects[index].property
Thành phần |
Sự miêu tả |
|---|---|
|
Tên của thể hiện Vision Sensor của bạn. |
|
Chỉ số của đối tượng trong mảng. Chỉ số bắt đầu từ |
|
One of the available object properties. |
tồn tại#
.exists trả về liệu chỉ mục đối tượng được chỉ định có chứa một đối tượng được phát hiện hợp lệ hay không.
Truy cập
SensorName.objects[index].exists
Giá trị trả về
Trả về giá trị Boolean cho biết chỉ mục đối tượng được chỉ định có chứa đối tượng được phát hiện hợp lệ hay không:
-
true— A valid object exists at the specified index. -
false— No object exists at the specified index.
Ví dụ
// 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);
}
.chiều rộng#
.width trả về chiều rộng của đối tượng được phát hiện.
Truy cập
SensorName.objects[index].width
Giá trị trả về
Trả về một số nguyên int biểu thị chiều rộng của đối tượng được phát hiện tính bằng pixel. Giá trị nằm trong khoảng từ 1 đến 316.
Ví dụ
// 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);
}
.chiều cao#
.height trả về chiều cao của đối tượng được phát hiện.
Truy cập
SensorName.objects[index].height
Giá trị trả về
Trả về một số nguyên int biểu thị chiều cao của vật thể được phát hiện tính bằng pixel. Giá trị nằm trong khoảng từ 1 đến 212.
Ví dụ
// 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 trả về tọa độ x của tâm đối tượng được phát hiện.
Truy cập
SensorName.objects[index].centerX
Giá trị trả về
Returns an int representing the x-coordinate of the object’s center in pixels. The value ranges from 0 to 316.
Ví dụ
// 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 trả về tọa độ y của tâm đối tượng được phát hiện.
Truy cập
SensorName.objects[index].centerY
Giá trị trả về
Returns an int representing the y-coordinate of the object’s center in pixels. The value ranges from 0 to 212.
Ví dụ
// 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 trả về tọa độ x của góc trên bên trái của khung bao quanh đối tượng được phát hiện.
Truy cập
SensorName.objects[index].originX
Giá trị trả về
Returns an int representing the x-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 316.
Ví dụ
// 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 trả về tọa độ y của góc trên bên trái của khung bao quanh đối tượng được phát hiện.
Truy cập
SensorName.objects[index].originY
Giá trị trả về
Returns an int representing the y-coordinate of the top-left corner of the object’s bounding box in pixels. The value ranges from 0 to 212.
Ví dụ
// 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);
}
.góc#
.angle trả về hướng của Mã màu được phát hiện.
Truy cập
SensorName.objects[index].angle
Giá trị trả về
Trả về một giá double biểu thị hướng của Mã màu được phát hiện tính bằng độ. Giá trị nằm trong khoảng từ 0 đến 359.9.
Ví dụ
// 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);
}