Python Forum
I have problem on Communication between C++ and Python using subprocess Module - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: I have problem on Communication between C++ and Python using subprocess Module (/thread-3937.html)



I have problem on Communication between C++ and Python using subprocess Module - hlfan1234567 - Jul-09-2017

I have problem on Communication between C++ and Python using subprocess Module

it is my Python Code for getting data.(it gets data from C++ OpenCV code.) (the data is coordinate x,y)


#this is imported for Inter-Language Communication!
from subprocess import Popen, PIPE


#Open Connection for CPP!
MyPopen = Popen(['~/ImageProcessingToGimbal/build/ZED_with_OpenCV'], shell=True, stdout=PIPE, stdin=PIPE)


while(1) :

  result = MyPopen.stdout.readline().strip()
  print(result)
and this is my OpenCV code in C++

line for communication between languages is colored by red.

[color=#ff3333]#include <stdio.h>
#include <string.h>
#include <iostream>
//this is imported for Communication between inter-language.[/color]


//this is imported for video processing.
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;

 int main( int argc, char** argv )
 {
    VideoCapture cap(0); //capture the video from web cam

    if ( !cap.isOpened() )  // if not success, exit program
    {
         cout << "Cannot open the web cam" << endl;
         return -1;
    }

    namedWindow("Control", CV_WINDOW_AUTOSIZE); //create a window called "Control"

 int iLowH = 0;
 int iHighH = 179;

 int iLowS = 0; 
 int iHighS = 255;

 int iLowV = 0;
 int iHighV = 255;

 //Create trackbars in "Control" window
 cvCreateTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179)
 cvCreateTrackbar("HighH", "Control", &iHighH, 179);

 cvCreateTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)
 cvCreateTrackbar("HighS", "Control", &iHighS, 255);

 cvCreateTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)
 cvCreateTrackbar("HighV", "Control", &iHighV, 255);

    while (true)
    {
        Mat imgOriginal;

        bool bSuccess = cap.read(imgOriginal); // read a new frame from video

         if (!bSuccess) //if not success, break loop
        {
             cout << "Cannot read a frame from video stream" << endl;
             break;
        }

  Mat imgHSV;

  cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
 
  Mat imgThresholded;
  Mat revimgThresholded;  //하얀색 검은색 뒤집기!

  inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); 
  //Threshold the image
  //inRange 함수는 뒤집기(하얀색이 검은색으로, 검은색이 하얀색으로)가 안되므로 Threshold 함수를 이용한다.

  threshold(imgThresholded, revimgThresholded, 2, 255, 1);  
   /*
   http://docs.opencv.org/2.4/doc/tutorials/imgproc/threshold/threshold.html

     0: Binary
     1: Binary Inverted
     2: Threshold Truncated
     3: Threshold to Zero
     4: Threshold to Zero Inverted

   원래
   THRESH_BINARY_INV 
   */

  //threshold 함수는 흑백에서만 되고 컬러에서는 안된다
  //threshold(imgHSV, imgThresholded, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), CV_THRESH_BINARY_INV);

  Mat imgBlobbing;
  //위 : 블로핑한 결과에 빨간 동그라미를 치기 위한 Mat
  
  
  //morphological opening (remove small objects from the foreground)
 erode(revimgThresholded, revimgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
 dilate(revimgThresholded, revimgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 

  //morphological closing (fill small holes in the foreground)
 dilate(revimgThresholded, revimgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) ); 
 erode(revimgThresholded, revimgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
  

  //블로빙 시작


  //패러미터 설정을 위해 객체를 선언한다.
  SimpleBlobDetector::Params params;

  //블롭 패러미터 설정!
  //params.filterByColor = 1;
  //params.blobColor = 0;

// Change thresholds
 // params.minThreshold = 0;
 // params.maxThreshold = 50;
 // params.filterByArea = 1;
 // params.minArea = 50;
 // params.maxArea = 10000;  
 params.filterByArea = true;
 params.minArea = 100;
 params.maxArea = 100000000;
 params.filterByInertia = false;
 params.filterByConvexity = true;
 params.minConvexity = 0.50;
 //params.filterByArea = false;

  //디텍터 객체를 디폴트 패러미터로서 선언한다.
  SimpleBlobDetector Detector(params);

  //블롭 탐색 시작
  std::vector<KeyPoint> mykeypoints;
  Detector.detect(revimgThresholded, mykeypoints);

  //탐색된 블롭들에 빨간 동그라미들을 칩니다!
  drawKeypoints(revimgThresholded, mykeypoints, imgBlobbing, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
 
  //이 코드 넣으면 Keypoint가 그려지는 것 뿐만 아니라 Threshold 이미지로 변해서 뺐음.
  //drawKeypoints(revimgThresholded, keypoints, imgOriginal, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);


//가장 큰 사이즈 추출단계
//사이즈, 좌표 둘 다 자료형 float이라고 가정하겠다
float maxsize = 0;
float maxx,maxy = 0;

for(std::vector<cv::KeyPoint>::iterator blobIterator = mykeypoints.begin(); blobIterator != mykeypoints.end(); blobIterator++){
   //std::cout << "size of blob is: " << blobIterator->size << std::endl;
   if(maxsize < blobIterator->size)
    {
     maxsize = blobIterator->size;
     maxx = blobIterator->pt.x;
     maxy = blobIterator->pt.y;
    }
   

    
    //std::cout << "max size : " << maxsize << endl;
    //std::cout << "position is at : " <<  "x : "  << maxx << "y : " << maxy << endl;
     
[color=#ff3333]    std::cout << maxx << std::endl;
    std::cout.flush();  

    std::cout << maxy << std::endl;
    std::cout.flush();   [/color]
} 




  //이제 imshow로 출력하기만 하면 됩니다. 
  imshow("Thresholded Image Inverted", revimgThresholded); //show the thresholded image
  imshow("Original", imgOriginal); //show the original image
  imshow("imgBlobbing", imgBlobbing); //라벨링 이미지를 보여줌.

        if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
       {
            cout << "esc key is pressed by user" << endl;
            break; 
       }
    }

  
   return 0;

}
when I run python script , I met empty screen.


[output]