title: C++ Opencv - Image handling after get it through sockets
body: <p>My question is about this previous question (unfortunely, the answer doesn't work for me): <a href="https://stackoverflow.com/questions/20314524/c-opencv-image-sending-through-socket">https://stackoverflow.com/questions/20314524/c-opencv-image-sending-through-socket</a></p>
  
  <p>After get the image, the code shows only a grey picture. Am I doing the correct image handling when sending and receive the image?</p>
  
  <p>Sender and receiver codes:</p>
  
  <p>Image sender:</p>
  
  <pre><code>#undef UNICODE
  
  #define WIN32_LEAN_AND_MEAN
  
  #include &lt;stdlib.h&gt;
  #include &lt;stdio.h&gt;
  
  #include &lt;iostream&gt;
  #include &lt;string.h&gt;
  
  #include &lt;windows.h&gt;
  #include &lt;winsock2.h&gt;
  #include &lt;ws2tcpip.h&gt;
  
  #include &lt;opencv2/objdetect/objdetect.hpp&gt;
  #include &lt;opencv2/highgui/highgui.hpp&gt;
  #include &lt;opencv2/imgproc/imgproc.hpp&gt;
  
  // Need to link with Ws2_32.lib
  #pragma comment (lib, "Ws2_32.lib")
  // #pragma comment (lib, "Mswsock.lib")
  
  #define DEFAULT_BUFLEN 512
  #define IMG_BUFLEN 1243897
  #define DEFAULT_PORT "27015"
  
  using namespace std;
  using namespace cv;
  
  int main(void)
  {
  WSADATA wsaData;
  int iResult;
  
  SOCKET ListenSocket = INVALID_SOCKET;
  SOCKET ClientSocket = INVALID_SOCKET;
  
  struct addrinfo *result = NULL;
  struct addrinfo hints;
  
  int iSendResult;
  char recvbuf[DEFAULT_BUFLEN];
  unsigned char * imgbuf;
  int recvbuflen = DEFAULT_BUFLEN;
  
  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
  if (iResult != 0) {
      printf("WSAStartup failed with error: %d\n", iResult);
      return 1;
  }
  
  ZeroMemory(&amp;hints, sizeof(hints));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_protocol = IPPROTO_TCP;
  hints.ai_flags = AI_PASSIVE;
  
  // Resolve the server address and port
  iResult = getaddrinfo(NULL, DEFAULT_PORT, &amp;hints, &amp;result);
  if ( iResult != 0 ) {
      printf("getaddrinfo failed with error: %d\n", iResult);
      WSACleanup();
      return 1;
  }
  
  // Create a SOCKET for connecting to server
  ListenSocket = socket(result-&gt;ai_family, result-&gt;ai_socktype, result-&gt;ai_protocol);
  if (ListenSocket == INVALID_SOCKET) {
      printf("socket failed with error: %ld\n", WSAGetLastError());
      freeaddrinfo(result);
      WSACleanup();
      return 1;
  }
  
  // Setup the TCP listening socket
  iResult = bind( ListenSocket, result-&gt;ai_addr, (int)result-&gt;ai_addrlen);
  if (iResult == SOCKET_ERROR) {
      printf("bind failed with error: %d\n", WSAGetLastError());
      freeaddrinfo(result);
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
  }
  
  freeaddrinfo(result);
  
  iResult = listen(ListenSocket, SOMAXCONN);
  if (iResult == SOCKET_ERROR) {
      printf("listen failed with error: %d\n", WSAGetLastError());
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
  }
  
  // Accept a client socket
  ClientSocket = accept(ListenSocket, NULL, NULL);
  if (ClientSocket == INVALID_SOCKET) {
      printf("accept failed with error: %d\n", WSAGetLastError());
      closesocket(ListenSocket);
      WSACleanup();
      return 1;
  }
  
  // No longer need server socket
  closesocket(ListenSocket);
  
  // Receive until the peer shuts down the connection
  do {
  
      iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
      if (iResult &gt; 0) {
          printf("SERVER - bytes: %d\n", iResult);
          //char * temp = (char *) malloc(9); memcpy(temp,recvbuf,8);
          if (strcmp(recvbuf, "ASK"))
          {   
              int retTamImg;              
              Mat captureFrame;               
              int imgSize = 0;
  
              VideoCapture captureDevice;
              captureDevice.open(0);
  
              if(!captureDevice.isOpened() )
              {
                  printf("Nao pode ler o video");
                  getchar();                  
              }
              captureDevice&gt;&gt;captureFrame;
  
              //---------------- SEND IMAGE ----------------//
              if (captureFrame.data != NULL)
              {               
                  retTamImg = captureFrame.total() * captureFrame.elemSize();
  
                  iSendResult = send( ClientSocket, (const char *) captureFrame.data, retTamImg, 0 );
  
                  if (iSendResult == SOCKET_ERROR) {
                      printf("resposta de pedido de face falhou. erro: %d\n", WSAGetLastError());
                      closesocket(ClientSocket);
                      WSACleanup();
                      return 1;
                  }
                  else
                      printf("resposta de pedido de face enviada com suceso. Bytes: %d\n", iSendResult);
  
              }
              //FECHA CAMERA
              captureDevice.release();
  
          }
      }
      else if (iResult == 0)
          printf("Connection closing...\n");
      else  {
          printf("recv failed with error: %d\n", WSAGetLastError());
          closesocket(ClientSocket);
          WSACleanup();
          getchar();
          return 1;
      }
  
  } while (iResult &gt; 0);
  
  // shutdown the connection since we're done
  iResult = shutdown(ClientSocket, SD_SEND);
  if (iResult == SOCKET_ERROR) {
      printf("shutdown failed with error: %d\n", WSAGetLastError());
      closesocket(ClientSocket);
      WSACleanup();
      getchar();
      return 1;
  }
  
  // cleanup
  closesocket(ClientSocket);
  WSACleanup();
  
  return 0;
  }
  </code></pre>
  
  <p>Image receiver:</p>
  
  <pre><code>#define WIN32_LEAN_AND_MEAN
  
  #include &lt;windows.h&gt;
  #include &lt;winsock2.h&gt;
  #include &lt;ws2tcpip.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;stdio.h&gt;
  
  #include &lt;opencv2/core/core.hpp&gt;
  #include &lt;opencv2/objdetect/objdetect.hpp&gt;
  #include &lt;opencv2/highgui/highgui.hpp&gt;
  #include &lt;opencv2/imgproc/imgproc.hpp&gt;
  
  
  // Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
  #pragma comment (lib, "Ws2_32.lib")
  #pragma comment (lib, "Mswsock.lib")
  #pragma comment (lib, "AdvApi32.lib")
  
  
  #define DEFAULT_BUFLEN 512
  #define IMG_BUFLEN 1243897
  #define DEFAULT_PORT "27015"
  
  using namespace std;
  using namespace cv;
  
  int __cdecl main(int argc, char **argv)
  {
  WSADATA wsaData;
  SOCKET ConnectSocket = INVALID_SOCKET;
  struct addrinfo *result = NULL,
                  *ptr = NULL,
                  hints;
  char sendbuf [DEFAULT_BUFLEN];
  char recvbuf[DEFAULT_BUFLEN];
  char * imgbuf;
  int iResult;
  int recvbuflen = DEFAULT_BUFLEN;
  
  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData);
  if (iResult != 0) {
      printf("WSAStartup failed with error: %d\n", iResult);
      getchar();
      return 1;
  }
  
  ZeroMemory( &amp;hints, sizeof(hints) );
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_protocol = IPPROTO_TCP;
  
  // Resolve the server address and port
  iResult = getaddrinfo("127.0.0.1", DEFAULT_PORT, &amp;hints, &amp;result);
  if ( iResult != 0 ) {
      printf("getaddrinfo failed with error: %d\n", iResult);
      WSACleanup();
      return 1;
  }
  
  // Attempt to connect to an address until one succeeds
  for(ptr=result; ptr != NULL ;ptr=ptr-&gt;ai_next) {
  
      // Create a SOCKET for connecting to server
      ConnectSocket = socket(ptr-&gt;ai_family, ptr-&gt;ai_socktype,
          ptr-&gt;ai_protocol);
      if (ConnectSocket == INVALID_SOCKET) {
          printf("socket failed with error: %ld\n", WSAGetLastError());
          WSACleanup();
          getchar();
          return 1;
      }
  
      // Connect to server.
      iResult = connect( ConnectSocket, ptr-&gt;ai_addr, (int)ptr-&gt;ai_addrlen);
      if (iResult == SOCKET_ERROR) {
          closesocket(ConnectSocket);
          ConnectSocket = INVALID_SOCKET;
          continue;
      }
      break;
  }
  
  freeaddrinfo(result);
  
  if (ConnectSocket == INVALID_SOCKET) {
      printf("Unable to connect to server!\n");
      WSACleanup();
      getchar();
      return 1;
  }
  
  //----------------- ASK FOR THE IMAGE ----------------------//
  
      strncpy(sendbuf, "ASK", 8); 
  
      // Send an initial buffer
      iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );
      if (iResult == SOCKET_ERROR) {
          printf("send ASK FACE failed with error: %d\n", WSAGetLastError());
          closesocket(ConnectSocket);
          WSACleanup();
          getchar();
          return 1;
      }
  
      printf("ASK FACE SENT Bytes Sent: %ld\n", iResult);
  
  //----------------- GET THE IMAGE ----------------------//
  
      Mat  img = Mat::zeros( 480,640, CV_8UC3);
      int  imgSize = (int) (img.total()*img.elemSize());
      char * sockData;
      sockData = (char *) malloc (sizeof(char) * imgSize + 1);
  
     for (int i = 0; i &lt; imgSize; i += iResult) 
     {
         iResult = recv(ConnectSocket, sockData +i, imgSize  - i, 0);
         if ( iResult &gt; 0 )
                  printf("CLIENTE - retorno do ASK FACE (%d/%d)- Bytes received: %d\n", i, imgSize, iResult);
  
          else if ( iResult == 0 )
              printf("CLIENTE - retorno do ASK FACE - Connection closed\n");
          else
              printf("CLIENTE - retorno do ASK FACE - error: %d\n", WSAGetLastError());
  
     }
  
       // Assign pixel value to img
       int iptr=0;
       for (int i = 0;  i &lt; img.rows; i++) {
            for (int j = 0; j &lt; img.cols; j++)    {                                     
                 img.at&lt;cv::Vec3b&gt;(i,j) = Vec3b(sockData[iptr+ 0],sockData[iptr+1],sockData[iptr+2]);
                 iptr=iptr+3;
             }
        }
  
       namedWindow("outputCapture", 1);
       imshow("outputCapture", img);
      // imwrite("C:\\Users\\USUARIO\\Documents\\VISAO\\servidor_imagens_cam\\imagem_salva.jpg",img);
  
  // shutdown the connection since no more data will be sent
  iResult = shutdown(ConnectSocket, SD_SEND);
  if (iResult == SOCKET_ERROR) {
      printf("shutdown failed with error: %d\n", WSAGetLastError());
      closesocket(ConnectSocket);
      WSACleanup();
      return 1;
  }
  
  // cleanup
  closesocket(ConnectSocket);
  WSACleanup();
  
  getchar();
  return 0;
  </code></pre>
  
  <p>}</p>