Repository navigation
Expand file tree
/
Copy pathtask1.cpp
More file actions
111 lines (91 loc) · 3.94 KB
/
Copy pathtask1.cpp
File metadata and controls
111 lines (91 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Sakshi B.
#include "task1.h"
#include "config.h"
#include <iostream>
// ─────────────────────────────────────────────────────────────────────────────
bool detectCorners(const cv::Mat& gray,
std::vector<cv::Point2f>& corners)
{
corners.clear();
bool found = cv::findChessboardCorners(
gray, BOARD_SIZE, corners,
cv::CALIB_CB_ADAPTIVE_THRESH |
cv::CALIB_CB_NORMALIZE_IMAGE |
cv::CALIB_CB_FAST_CHECK);
if (found) {
// Refine to sub-pixel accuracy
cv::cornerSubPix(gray, corners,
SUBPIX_WIN, SUBPIX_ZERO,
SUBPIX_CRITERIA);
}
return found;
}
// ─────────────────────────────────────────────────────────────────────────────
void drawCornersOverlay(cv::Mat& frame,
const std::vector<cv::Point2f>& corners,
bool found)
{
if (found) {
cv::drawChessboardCorners(frame, BOARD_SIZE, corners, found);
// Corner count + first-corner coordinates
int n = static_cast<int>(corners.size());
std::string info =
"Corners: " + std::to_string(n) +
" First: (" +
std::to_string(static_cast<int>(corners[0].x)) + ", " +
std::to_string(static_cast<int>(corners[0].y)) + ")";
cv::putText(frame, info,
cv::Point(10, 30),
cv::FONT_HERSHEY_SIMPLEX, 0.7,
cv::Scalar(0, 255, 0), 2);
} else {
cv::putText(frame, "Target NOT detected",
cv::Point(10, 30),
cv::FONT_HERSHEY_SIMPLEX, 0.8,
cv::Scalar(0, 0, 255), 2);
}
std::string label = "Task 1 | Checkerboard: " +
std::string(found ? "DETECTED" : "SEARCHING...");
drawStatusBar(frame, label, found);
}
// ─────────────────────────────────────────────────────────────────────────────
void runTask1(int argc, char* argv[])
{
cv::VideoCapture cap = openVideoSource(argc, argv);
if (!cap.isOpened()) {
std::cerr << "[Task1][ERROR] Cannot open video source.\n";
return;
}
std::cout << "=== Task 1: Checkerboard Corner Detection ===\n"
<< "Board: " << BOARD_COLS << " x " << BOARD_ROWS
<< " internal corners\n"
<< "Press 's' to save frame | 'q'/ESC to quit\n\n";
cv::Mat frame, gray;
int frameCount = 0, savedCount = 0;
while (true) {
cap >> frame;
if (frame.empty()) { std::cout << "[Task1] End of stream.\n"; break; }
++frameCount;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
std::vector<cv::Point2f> corners;
bool found = detectCorners(gray, corners);
drawCornersOverlay(frame, corners, found);
// Terminal diagnostics every 30 frames
if (found && frameCount % 30 == 0) {
std::cout << "[Task1][Frame " << frameCount << "] "
<< corners.size() << " corners | "
<< "first=(" << corners[0].x
<< ", " << corners[0].y << ")\n";
}
cv::imshow("Task 1 - Corner Detection", frame);
int key = cv::waitKey(1) & 0xFF;
if (key == 'q' || key == 27) break;
if (key == 's') {
std::string fn = "task1_frame_" + std::to_string(++savedCount) + ".png";
cv::imwrite(fn, frame);
std::cout << "[Task1][SAVED] " << fn << "\n";
}
}
cap.release();
cv::destroyAllWindows();
}