Advertisement
Week045

Project 4

Oct 31st, 2023 (edited)
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.60 KB | None | 0 0
  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/opencv.hpp>
  3. #include <iostream>
  4. #include <conio.h>
  5. #include <Windows.h>
  6. #include <devguid.h>
  7. #include <setupapi.h>
  8. #include <ctime>
  9. #include <cstring>
  10.  
  11. #pragma comment(lib, "setupapi.lib")
  12.  
  13. using namespace std;
  14. using namespace cv;
  15.  
  16. void printInfo();
  17. char* getInfo(int command);
  18. VideoWriter createVideoWriter();
  19. char* getCurrentTime();
  20. void printKeyInfo();
  21.  
  22.  
  23. bool isConsole = true;
  24. bool isWindowOpen = true;
  25. bool isPhoto = false;
  26. bool isRecording = false;
  27. bool isEnd = false;
  28.  
  29.  
  30. VideoWriter writer;
  31. HHOOK keyBoardHook;
  32.  
  33. LRESULT CALLBACK LogKey(int nCode, WPARAM wParam, LPARAM lParam) {
  34.  
  35.     if (wParam == WM_KEYDOWN) {
  36.         KBDLLHOOKSTRUCT* keyStruct = (KBDLLHOOKSTRUCT*)lParam;
  37.  
  38.         switch (keyStruct->vkCode)
  39.         {
  40.            
  41.         case 73:
  42.             if (isConsole == true) {
  43.                 system("CLS");
  44.                 printInfo();
  45.             }
  46.             break;
  47.         case 83:
  48.             if (isConsole == true) {
  49.                 system("CLS");
  50.                 printKeyInfo();
  51.             }
  52.             break;
  53.         case 67:
  54.             if (isConsole == true) {
  55.                 ShowWindow(GetConsoleWindow(), SW_HIDE);
  56.                 isConsole = false;
  57.             }
  58.             else {
  59.                 isConsole = true;
  60.                 ShowWindow(GetConsoleWindow(), SW_SHOW);
  61.             }
  62.             break;
  63.         case 72: // H
  64.             isWindowOpen = (isWindowOpen == true) ? false : true;
  65.  
  66.             if (isWindowOpen == true) {
  67.                 namedWindow("Web-camera", WINDOW_NORMAL);
  68.             }
  69.  
  70.             if (isWindowOpen == false) {
  71.                 destroyWindow("Web-camera");
  72.             }
  73.            
  74.             break;
  75.         case 80: // P
  76.             isPhoto = true;
  77.             break;
  78.         case 86: // V
  79.             isRecording = (isRecording == true) ? false : true;
  80.             if (writer.isOpened()) {
  81.                 writer.release();
  82.             }
  83.             else writer = createVideoWriter();
  84.            
  85.             break;
  86.         case 27:
  87.             isEnd = true;
  88.         }
  89.  
  90.         return CallNextHookEx(keyBoardHook, nCode, wParam, lParam);
  91.     }
  92. }
  93.  
  94. int main() {
  95.     keyBoardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LogKey, NULL, 0);
  96.  
  97.     MSG msg;
  98.     Mat frame;
  99.     VideoCapture cap(0);
  100.  
  101.     system("CLS");
  102.  
  103.     if (!cap.isOpened()) {
  104.         cout << "Frame was not captured " << endl;
  105.         return 0;
  106.     }
  107.     namedWindow("Web-camera", WINDOW_NORMAL);
  108.  
  109.     while (true) {
  110.        
  111.         while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
  112.             TranslateMessage(&msg);
  113.             DispatchMessage(&msg);
  114.  
  115.             if (msg.message == WM_QUIT) {
  116.                 cout << "Received WM_QUIT message, exiting loop" << endl;
  117.                 break;
  118.             }
  119.         }
  120.  
  121.         if (isEnd == true) {
  122.             break;
  123.         }
  124.        
  125.         cap.read(frame);
  126.         if (frame.empty())
  127.             exit(-3);
  128.  
  129.         char t[80];
  130.         strcpy_s(t, 80, getCurrentTime());
  131.         putText(frame, t, Point(260, 465), FONT_HERSHEY_SIMPLEX, 1, Scalar(128, 128, 128), 1);
  132.  
  133.         if (isPhoto == true) {
  134.             static int photo_counter = 0;
  135.             string name;
  136.             name = "Photo\\photo" + to_string(photo_counter++) + ".jpg";
  137.             Mat new_frame = frame;
  138.             imwrite(name, new_frame);
  139.             isPhoto = false;
  140.         }
  141.  
  142.         if (isRecording == true) {
  143.             putText(frame, "Recording", Point(10, 30), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 0, 255), 2);
  144.             writer.write(frame);
  145.         }
  146.  
  147.         if(isWindowOpen == true)
  148.             imshow("Web-camera", frame);
  149.     }
  150.  
  151.     UnhookWindowsHookEx(keyBoardHook);
  152.     destroyAllWindows();
  153.  
  154.     return 0;
  155. }
  156.  
  157. void printInfo() {
  158.    
  159.     setlocale(LC_ALL, "Russian");
  160.     cout << "INFORMATION ABOUT WEBCAM" << endl;
  161.  
  162.     const int commandNumber = 7;
  163.     int command[commandNumber] = { SPDRP_FRIENDLYNAME,
  164.                                     SPDRP_MFG,
  165.                                     SPDRP_DRIVER,
  166.                                     SPDRP_LOCATION_INFORMATION,
  167.                                     SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
  168.                                     SPDRP_CAPABILITIES,
  169.                                     SPDRP_HARDWAREID };
  170.  
  171.     for (int i = 0; i < commandNumber; i++) {
  172.  
  173.         char data[256];
  174.         strcpy_s(data, 256, getInfo(command[i]));
  175.  
  176.         switch (i) {
  177.         case 0:
  178.             cout << " 1) Name: ";
  179.             break;
  180.         case 1:
  181.             cout << " 2) Manufacter: ";
  182.             break;
  183.         case 2:
  184.             cout << " 3) Driver: ";
  185.             break;
  186.         case 3:
  187.             cout << " 4) Local information: ";
  188.             break;
  189.         case 4:
  190.             cout << " 5) Object name:";
  191.             break;
  192.         case 5:
  193.             cout << " 6) Capabilities: ";
  194.             break;
  195.         case 6:
  196.             cout << " 7) Id: ";
  197.             break;
  198.         }
  199.         cout << data << endl;
  200.     }
  201. }
  202.  
  203. char* getInfo(int command) {
  204.     HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_CAMERA, NULL, NULL, DIGCF_PRESENT);
  205.     if (hDeviceInfo == INVALID_HANDLE_VALUE)
  206.         return NULL;
  207.    
  208.     SP_DEVINFO_DATA spDeviceInfoData = { 0 };
  209.     ZeroMemory(&spDeviceInfoData, sizeof(SP_DEVINFO_DATA));
  210.     spDeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  211.  
  212.     SetupDiEnumDeviceInfo(hDeviceInfo, 0, &spDeviceInfoData);
  213.     WCHAR data[256];
  214.  
  215.     SetupDiGetDeviceRegistryProperty(hDeviceInfo, &spDeviceInfoData, command, NULL, (PBYTE)data, sizeof(data), NULL);
  216.    
  217.     char ansiData[256];
  218.  
  219.     WideCharToMultiByte(CP_ACP, 0, data, -1, ansiData, sizeof(ansiData), NULL, NULL);
  220.  
  221.     return ansiData;
  222. }
  223.  
  224. char* getCurrentTime() {
  225.     time_t t = time(0);
  226.     struct tm now;
  227.     if (localtime_s(&now, &t) != 0) {
  228.         exit(-2);
  229.     }
  230.     char datetime[80];
  231.     strftime(datetime, 80, "%Y-%m-%d %H:%M:%S", &now);
  232.     return datetime;
  233. }
  234.  
  235. VideoWriter createVideoWriter() {
  236.     static int counter = 0;
  237.     int frameWidth = 640;
  238.     int frameHeight = 480;
  239.     int framePesSeconds = 13;
  240.  
  241.     string name = "Video\\video" + to_string(counter++) + ".mp4";
  242.  
  243.     VideoWriter writer(name, VideoWriter::fourcc('H', 'E', 'V', 'C'), framePesSeconds, Size(frameWidth, frameHeight));
  244.  
  245.     if (!writer.isOpened())
  246.         exit(-1);
  247.  
  248.     return writer;
  249. }
  250.  
  251. void printKeyInfo() {
  252.     cout << "INFORMATION ABOUT KEYS" << endl;
  253.     cout << " 1) Key \"I\" - information about the webcam" << endl <<
  254.         " 2) Key \"C\" - console" << endl <<
  255.         " 3) Key \"H\" - information from the webcam" << endl <<
  256.         " 4) Key \"P\" - photo" << endl <<
  257.         " 5) Key \"V\" - video" << endl <<
  258.         " 6) Key \"S\" - keys" << endl <<
  259.         " 7) Key \"ESC\" - terminate the program" << endl;
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement