C2011とC2079のエラーを解決したい

main.cpp

1#include <vector> 2#include <opencv2/opencv.hpp> 3#include <windows.h> 4#include <process.h> 5#include <stdio.h> 6#include "ImageSend.h" 7#include <string.h> 8#include <string> 9 10#define _WINSOCK_DEPRECATED_NO_WARNINGS 11#define _CRT_SECURE_NO_WARNINGS 12 13 14// シリアル通信用定数 15#define COM_PORT "COM3" // ArduinoのCOMポート 16#define BAUD_RATE 9600 // Arduinoとの通信速度 17// 送受信データを入れる配列(256バイト分) 18#define DATA_SIZE 256 19#pragma comment(lib, "wsock32.lib") 20using namespace std; 21class ImageSender { 22public: 23 ImageSender() { 24 sendSize = 1024 * 4; 25 buff = new char[sendSize]; 26 }; 27 28 ~ImageSender() { this->close(); }; 29 30 int open(const char* ServerName, unsigned short PortNo) { 31 HOSTENT* pHostent = gethostbyname(ServerName); 32 33 if (pHostent == NULL) { 34 DWORD addr = inet_addr(ServerName); 35 pHostent = gethostbyaddr((char*)&addr, 4, AF_INET); 36 } 37 38 if (pHostent == NULL) { 39 cerr << "Server not found" << endl; 40 return -1; 41 } 42 43 s = socket(AF_INET, SOCK_STREAM, 0); 44 if (s < 0) { 45 cerr << "Socket error" << endl; 46 return -2; 47 } 48 49 memset(&sockaddrin, 0, sizeof(sockaddrin)); 50 memcpy(&(sockaddrin.sin_addr), pHostent->h_addr_list[0], pHostent->h_length); 51 sockaddrin.sin_family = AF_INET; 52 sockaddrin.sin_port = htons(PortNo); 53 54 if (connect(s, (struct sockaddr*)&sockaddrin, sizeof(sockaddrin))) { 55 cerr << "Connection error" << endl; 56 exit(0); 57 } 58 59 return 0; 60 } 61 62 bool sendImg(cv::Mat& image, std::vector<std::vector<unsigned int>>* result) { 63 char recvBuf[256]; 64 65 // Convert image to JPEG format 66 std::vector<uchar> buf; 67 std::vector<int> param = std::vector<int>(2); 68 param[0] = cv::IMWRITE_JPEG_QUALITY; 69 param[1] = 95; 70 cv::imencode(".jpg", image, buf, param); 71 buf.push_back('D'); 72 buf.push_back('O'); 73 buf.push_back('N'); 74 buf.push_back('E'); 75 buf.push_back('\n'); 76 77 // Send image data 78 for (;;) { 79 unsigned int copySize = 0; 80 if (sendSize <= buf.size()) 81 copySize = sendSize; 82 else 83 copySize = buf.size(); 84 memset(&buff[0], 0x00, sizeof(buff)); 85 memcpy(&buff[0], &buf[0], copySize); 86 send(s, buff, copySize, 0); 87 for (int i = 0; i < copySize; i++) { 88 buf.erase(buf.begin()); 89 } 90 if (copySize < sendSize) 91 break; 92 } 93 94 int num; 95 memset(&recvBuf[0], 0x00, sizeof(recvBuf)); 96 recv(s, &recvBuf[0], 32, 0); 97 sscanf_s(recvBuf, "NumOfPerson %02d\n", &num); 98 99 std::vector<unsigned int> array; 100 int jointNum = 18 * 2; 101 array.resize(jointNum); 102 result->clear(); 103 104 for (unsigned int i = 0; i < num; i++) { 105 std::vector<std::string> strs; 106 memset(&recvBuf[0], 0x00, sizeof(recvBuf)); 107 recv(s, &recvBuf[0], 256, 0); 108 std::string str = recvBuf; 109 strs = split(str, ','); 110 111 for (unsigned int j = 0; j < jointNum; j++) { 112 array[j] = atoi(strs[j].c_str()); 113 } 114 115 result->push_back(array); 116 } 117 118 return true; 119 } 120 121 void close() { 122 closesocket(s); 123 } 124 125private: 126 unsigned int sendSize; 127 char* buff; 128 SOCKADDR_IN sockaddrin; 129 SOCKET s; 130 131 std::vector<std::string> split(std::string str, char del) { 132 int first = 0; 133 int last = str.find_first_of(del); 134 std::vector<std::string> result; 135 while (first < str.size()) { 136 std::string subStr(str, first, last - first); 137 result.push_back(subStr); 138 first = last + 1; 139 last = str.find_first_of(del, first); 140 if (last == std::string::npos) { 141 last = str.size(); 142 } 143 } 144 return result; 145 } 146}; 147 148int main(int argc, char** argv) { 149 // OpenPoseの通信設定 150 const char* OPENPOSE_IP = "?"; 151 const int OPENPOSE_PORT = ?; 152 153 // カメラの設定 154 int w = 740, h = 580; // 横と縦の解像度 155 cv::VideoCapture cap; 156 cap.open(0); 157 cap.set(cv::CAP_PROP_FRAME_WIDTH, w); 158 cap.set(cv::CAP_PROP_FRAME_HEIGHT, h); 159 160 // OpenPoseとの通信クラス 161 ImageSender Imagesend; 162 // OpenPose用変数 163 std::vector<std::vector<unsigned int>> result; 164 cv::Mat frame, gray; 165 166 // ウィンドウを開く 167 cv::namedWindow("window", cv::WINDOW_AUTOSIZE); 168 169 // シリアル通信の設定 170 HANDLE hComm; 171 DCB dcbSerialParams = { 0 }; 172 COMMTIMEOUTS timeouts = { 0 }; 173 174 // ポート名をワイド文字列に変換 175 wchar_t portNameWide[10]; 176 mbstowcs(portNameWide, COM_PORT, strlen(COM_PORT) + 1); 177 178 // シリアルポートを開く 179 hComm = CreateFile(portNameWide, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 180 if (hComm == INVALID_HANDLE_VALUE) { 181 printf("Error opening serial port\n"); 182 return 1; 183 } 184 185 // DTR(データ端末準備信号)とRTS(要求送信信号)をクリアする 186 EscapeCommFunction(hComm, CLRDTR); 187 EscapeCommFunction(hComm, CLRRTS); 188 189 // シリアルポートパラメータの設定 190 dcbSerialParams.DCBlength = sizeof(dcbSerialParams); 191 if (!GetCommState(hComm, &dcbSerialParams)) { 192 printf("Error getting state\n"); 193 CloseHandle(hComm); 194 return 1; 195 } 196 dcbSerialParams.BaudRate = BAUD_RATE; 197 dcbSerialParams.ByteSize = 8; 198 dcbSerialParams.StopBits = ONESTOPBIT; 199 dcbSerialParams.Parity = NOPARITY; 200 if (!SetCommState(hComm, &dcbSerialParams)) { 201 printf("Error setting state\n"); 202 CloseHandle(hComm); 203 return 1; 204 } 205 206 // タイムアウトの設定 207 timeouts.ReadIntervalTimeout = 50; 208 timeouts.ReadTotalTimeoutConstant = 50; 209 timeouts.ReadTotalTimeoutMultiplier = 10; 210 timeouts.WriteTotalTimeoutConstant = 50; 211 timeouts.WriteTotalTimeoutMultiplier = 10; 212 if (!SetCommTimeouts(hComm, &timeouts)) { 213 printf("Error setting timeouts\n"); 214 CloseHandle(hComm); 215 return 1; 216 } 217 218 // データ送信バッファ 219 char SendDataBuff[DATA_SIZE]; 220 DWORD dwBytesWritten; 221 222 while (cap.isOpened()) { 223 // カメラ画像を一枚撮る 224 cap >> frame; 225 226 // OpenPoseが読み取れるように画像を編集 227 cv::resize(frame, frame, cv::Size(320, 240)); 228 cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); 229 230 // OpenPose画像を送信し,結果を受け取る 231 if (!Imagesend.open(OPENPOSE_IP, OPENPOSE_PORT)) { 232 printf("Failed to connect to OpenPose server\n"); 233 continue; 234 } 235 if (!Imagesend.sendImg(frame, &result)) { 236 printf("Failed to send image to OpenPose server\n"); 237 Imagesend.close(); 238 continue; 239 } 240 Imagesend.close(); 241 242 // OpenPoseの結果があれば処理を行う 243 if (!result.empty()) { 244 int person_id = 0; 245 246 // 例として関節の座標を取得するコード 247 int joint_id = 0; // 鼻 248 int nx = result[person_id][joint_id * 2 + 0]; 249 int ny = result[person_id][joint_id * 2 + 1]; 250 joint_id = 1; // 首 251 int nex = result[person_id][joint_id * 2 + 0]; 252 int ney = result[person_id][joint_id * 2 + 1]; 253 254 // コマンド生成ロジック 255 string data; 256 if ((5 < nex - nx) && (nex - nx < 15)) { 257 data = "tmmr"; 258 } 259 else if ((30 <= nex - nx) && (nex - nx < 60)) { 260 data = "mmr"; 261 } 262 263 // Arduinoにコマンドを送信 264 sprintf_s(SendDataBuff, "%s\n", data.c_str()); 265 if (!WriteFile(hComm, SendDataBuff, strlen(SendDataBuff), &dwBytesWritten, NULL)) { 266 printf("Error writing to serial port\n"); 267 } 268 } 269 // カメラ画像を表示する 270 cv::imshow("window", frame); 271 if (cv::waitKey(10) == 27) break; // ESCキーで終了 272 } 273 // シリアルポートを閉じる 274 CloseHandle(hComm); 275 276 return 0; 277}

コメントを投稿

0 コメント