diff --git a/camera-node-control/camera.cpp b/camera-node-control/camera.cpp index 0c71751ee219b7450b0b38457f5b1e48fe4ae7da..407a497e1c3b28fd5ff4080c07a251988630f2b5 100644 --- a/camera-node-control/camera.cpp +++ b/camera-node-control/camera.cpp @@ -11,7 +11,6 @@ #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> -#include <libcamera/libcamera.h> #include <opencv2/opencv.hpp> #include <iomanip> #include <stdexcept> @@ -19,12 +18,11 @@ #include <arpa/inet.h> using namespace std; -using namespace libcamera; using namespace GPIO; #define BUFFER_SIZE 1024 -#define SERVER_ADDR "127.0.0.1" +#define SERVER_ADDR "192.168.121.4" #define SERVER_PORT 12345 #define POUT 535 // 초음파 트리거 핀 (GPIO23) @@ -71,86 +69,6 @@ int server_socket, python_socket; // 서버 소켓 및 파이썬 소켓 bool detected = false; // 차량 감지 여부 bool fireAlert = false; // 화재 경보 여부 pthread_t sensor_thread, receive_thread; -shared_ptr<Camera> camera; -unique_ptr<CameraManager> cm; -unique_ptr<Request> request; - - -// 서버 메시지 수신 스레드 -void* receive_message(void* arg) { - char buffer[BUFFER_SIZE]; - - while (true) { - auto read_bytes = read(server_socket, buffer, BUFFER_SIZE - 1); - if (read_bytes <= 0) { - cout << "서버와의 연결이 종료되었습니다." << endl; - close(server_socket); - exit(0); - } - - buffer[read_bytes] = '\0'; - cout << "서버로부터 받은 메시지: " << buffer << endl; - - string msg(buffer); - msg = msg.substr(0, msg.find_first_of("\r\n")); - - if (msg == "0-FIRE") { - fireAlert = true; - cout << "화재 경보가 발생했습니다." << endl; - } else if (msg == "0-CLEAR") { - fireAlert = false; - cout << "화재 경보가 해제되었습니다." << endl; - } - } - - return nullptr; -} - -// 초음파 센서 측정 스레드 -void* ultrasonic_sensor(void *arg) { - clock_t start_t, end_t; - while (1) { - // 초음파 센서 측정 - GPIOWrite(POUT, Value::HIGH); - usleep(10); - GPIOWrite(POUT, Value::LOW); - - // 에코 핀 신호 대기 - while (GPIORead(PIN) == 0) start_t = clock(); - while (GPIORead(PIN) == 1) end_t = clock(); - - double time = (double) (end_t - start_t) / CLOCKS_PER_SEC; // 시간 계산 - double distance = time / 2 * 34000; // cm 단위 거리 계산 - - cout << distance << "cm" << endl; - if (!detected && distance <= DISTANCE) { // 10cm 이하 -> 차량 접근 - detected = true; - cout << "차량 감지: " << distance << "cm" << endl; - - // 카메라를 시작합니다. - if (camera->start()) { - throw runtime_error("Failed to start camera"); - } - - // 카메라 촬영 - if (camera->queueRequest(request.get()) < 0) { - throw runtime_error("Failed to queue request"); - } - - this_thread::sleep_for(chrono::milliseconds(2000)); - - // 카메라 종료 - camera->stop(); - } else if (detected && distance > 10) { // 10cm 초과 -> 차량 없음 - detected = false; - cout << "차량 감지 해제" << endl; - } - - usleep(500000); // 0.5초 주기 - } - - return nullptr; -} vector<Rect> detect_character(const vector<Rect>& rects) { for (size_t idx = 0; idx < rects.size(); idx++) { @@ -323,21 +241,56 @@ void detect_plate(const string& img_path) { } } +// 서버 메시지 수신 스레드 +void* receive_message(void* arg) { + char buffer[BUFFER_SIZE]; + + while (true) { + auto read_bytes = read(server_socket, buffer, BUFFER_SIZE - 1); + if (read_bytes <= 0) { + cout << "서버와의 연결이 종료되었습니다." << endl; + close(server_socket); + exit(0); + } + + buffer[read_bytes] = '\0'; + cout << "서버로부터 받은 메시지: " << buffer << endl; + + string msg(buffer); + msg = msg.substr(0, msg.find_first_of("\r\n")); + + if (msg == "0-FIRE") { + fireAlert = true; + cout << "화재 경보가 발생했습니다." << endl; + } else if (msg == "0-CLEAR") { + fireAlert = false; + cout << "화재 경보가 해제되었습니다." << endl; + } + } + + return nullptr; +} + +// 초음파 센서 측정 스레드 +void* ultrasonic_sensor(void *arg) { + clock_t start_t, end_t; + while (1) { + // 초음파 센서 측정 + GPIOWrite(POUT, Value::HIGH); + usleep(10); + GPIOWrite(POUT, Value::LOW); -void requestComplete(Request* request) { - if (request->status() == Request::RequestComplete) { - const FrameBuffer* buffer = request->buffers().begin()->second; - const FrameBuffer::Plane& plane = buffer->planes().front(); + // 에코 핀 신호 대기 + while (GPIORead(PIN) == 0) start_t = clock(); + while (GPIORead(PIN) == 1) end_t = clock(); - void* memory = mmap(nullptr, plane.length, PROT_READ, MAP_SHARED, plane.fd.get(), 0); - if (memory != MAP_FAILED) { - cv::Mat raw(800, 1600, CV_8UC2, memory); - cv::Mat bgr; - cv::cvtColor(raw, bgr, cv::COLOR_YUV2BGR_YUYV); + double time = (double) (end_t - start_t) / CLOCKS_PER_SEC; // 시간 계산 + double distance = time / 2 * 34000; // cm 단위 거리 계산 - vector<unsigned char> jpeg_buffer; - vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 90}; - cv::imencode(".jpg", bgr, jpeg_buffer, params); + cout << distance << "cm" << endl; + if (!detected && distance <= DISTANCE) { // 10cm 이하 -> 차량 접근 + detected = true; + cout << "차량 감지: " << distance << "cm" << endl; // 현재 시간 타임스탬프 auto now = chrono::system_clock::now(); @@ -347,65 +300,28 @@ void requestComplete(Request* request) { string timestamp_str = timestamp.str(); string image_filename = IMAGES_DIR + "/image_" + timestamp_str + ".jpg"; + string cmd = "libcamera-still --nopreview --immediate --rotation=180 --width=1296 --height=972 --denoise off -t 1 -o " + image_filename; - ofstream file(image_filename, ios::binary); - if (file) { - file.write(reinterpret_cast<char*>(jpeg_buffer.data()), jpeg_buffer.size()); - file.close(); + if (system(cmd.c_str()) == 0) { cout << "이미지 저장: " << image_filename << endl; } else { cerr << "이미지 저장 실패: " << image_filename << endl; } - munmap(memory, plane.length); detect_plate(image_filename); + } else if (detected && distance > 10) { // 10cm 초과 -> 차량 없음 + detected = false; + cout << "차량 감지 해제" << endl; } - request->reuse(Request::ReuseBuffers); + usleep(500000); // 0.5초 주기 } + + return nullptr; } int main() { try { - cm = make_unique<CameraManager>(); - cm->start(); - - auto cameras = cm->cameras(); - if (cameras.empty()) { - throw runtime_error("No cameras found!"); - } - - camera = cameras[0]; - camera->acquire(); - - unique_ptr<CameraConfiguration> config = camera->generateConfiguration({StreamRole::StillCapture}); - config->orientation = Orientation::Rotate180; - - StreamConfiguration &streamConfig = config->at(0); - streamConfig.size = Size(1600, 900); - streamConfig.pixelFormat = formats::YUYV; - streamConfig.bufferCount = 1; - - CameraConfiguration::Status status = config->validate(); - if (status != CameraConfiguration::Valid) { - throw runtime_error("Camera configuration invalid"); - } - - camera->configure(config.get()); - - FrameBufferAllocator allocator(camera); - Stream *stream = streamConfig.stream(); - allocator.allocate(stream); - - camera->requestCompleted.connect(requestComplete); - - const vector<unique_ptr<FrameBuffer>> &buffers = allocator.buffers(stream); - request = camera->createRequest(); - - if (request->addBuffer(stream, buffers.at(0).get()) < 0) { - throw runtime_error("Failed to add buffer to request"); - } - struct sockaddr_in server_addr, python_addr; // 서버 노드 소켓 생성 @@ -468,13 +384,6 @@ int main() { close(python_socket); GPIOUnexport(POUT); GPIOUnexport(PIN); - - camera->requestCompleted.disconnect(); - camera->stop(); - camera->release(); - camera.reset(); - allocator.free(stream); - cm->stop(); } catch (const exception& e) { cerr << "Error: " << e.what() << endl; return 1;