Using OpenCV Output as Webcam

前端 未结 5 2264
忘掉有多难
忘掉有多难 2020-12-14 08:49

So, I want to write a program to make the processed output from OpenCV be seen as a WebCam. I want to use it to create effects for a program like Skype. I am stuck and Googl

5条回答
  •  借酒劲吻你
    2020-12-14 09:38

    One way is to doing this is send Mat object directly to socket and at the received side convert byte array to Mat but the problem is you need to install OpenCV on both both PC. In another way you can use Mjpeg streamer to stream video to ibternet and process the video at receiving side, here you need to install OpenCV on receiving side only.

    Using Socket

    Get Mat.data and directly send to the socket, the data format is like BGR BGR BGR.... On the receiving side you should know the size of image you are going to receive. After receiving just assign the received buffer(BGR BGR... array) to a Mat of size you already know.

    Client:-

    Mat frame;
    frame = (frame.reshape(0,1)); // to make it continuous
    
    int  imgSize = frame.total()*frame.elemSize();
    
    // Send data here
    bytes = send(clientSock, frame.data, imgSize, 0))
    

    Server:-

    Mat  img = Mat::zeros( height,width, CV_8UC3);
       int  imgSize = img.total()*img.elemSize();
       uchar sockData[imgSize];
    
     //Receive data here
    
       for (int i = 0; i < imgSize; i += bytes) {
       if ((bytes = recv(connectSock, sockData +i, imgSize  - i, 0)) == -1) {
         quit("recv failed", 1);
        }
       }
    
     // Assign pixel value to img
    
     int ptr=0;
     for (int i = 0;  i < img.rows; i++) {
      for (int j = 0; j < img.cols; j++) {                                     
       img.at(i,j) = cv::Vec3b(sockData[ptr+ 0],sockData[ptr+1],sockData[ptr+2]);
       ptr=ptr+3;
       }
      }
    

    For socket programming you can refer this link

    Using Mjpeg Streamer

    Here you need to install Mjpeg streamer software in PC where web cam attached and on all receiving PC you need to install OpenCV and process from there. You can directly open web stream using OpenCV VideoCapture class like

    Cap.open("http://192.168.1.30:8080/?dummy=param.mjpg");
    

提交回复
热议问题