Robotics StackExchange | Archived questions

How to send the Mat data via rosbridge?

Hello, my purpose is to send the Mat data of the android's display image from Android to ROS PC and commucicate via rosbridge. Both Android and PC has installed Opencv. I would like to directly send Mat data that is not exchange for the other data. But , I can't send the Mat data correctly. The PC is not capable of getting the data (that is to be Error in the middle of sending) and the sending speed is very slow(I displayed the recieved data in PC by using TCP test tool) and sometime freezes showing the data.

Could you let me know the solution? and in case of that I want to send the image data via rosbridge how should I do?

My code(Android studio)

package opencv.ros.com.camera_opencv;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.WindowManager;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;

import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;


public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener {
    private CameraBridgeViewBase mCameraView;
    private Mat mOutputFrame;
    private static final int PORT = 9250;
    private static final String IP_ADDR = "111.111.111.11"; 
    private volatile int Flag = 0;
    private Socket socket;    
    private InputStream in;   
    private OutputStream out; 
    private StringBuffer Sendmessage;

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                    mCameraView.enableView();
                    try {
                             byte[] w ="0".getBytes("UTF8");
                            w = ("raw" + "\r" + "\n" + "\r" + "\n").getBytes("UTF8");
                           sendData(w);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        mCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view);
        mCameraView.setCvCameraViewListener(this);

    }

    @Override
    public void onPause() {
        if (mCameraView != null) {
            mCameraView.disableView();
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, this, mLoaderCallback);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            Flag = 1;
            System.out.println(Flag);


        }
        return true;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mCameraView != null) {
            mCameraView.disableView();
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        // Mat(int rows, int cols, int type)
        mOutputFrame = new Mat(width, height, CvType.CV_8UC3);
    }

    @Override
    public void onCameraViewStopped() {
        mOutputFrame.release();
    }

    @Override
    public Mat onCameraFrame(Mat inputFrame) throws UnsupportedEncodingException {

            Core.absdiff(inputFrame, new Scalar(0, 0, 0), mOutputFrame);
            if (Flag == 1) {
                Flag = 0;
                String a =  mOutputFrame.dump();
               String b= a.replaceAll(";",","); 
                byte[] ds = a.getBytes("UTF8");

                byte[]  bytedata ="0".getBytes("UTF8");

                Sendmessage=new StringBuffer();

                Sendmessage.append("{"+"\""+"op"+"\""+":"+ "\""+"publish"+"\""+","+"\""+"msg"+"\""+":"+"{"+"\""+"header"+"\""+":"+"{"+"\""+"seq"+"\""+":"+0+","+"\""+"stamp"+"\""+":"+"{"+"\""+"secs"+"\""+":"+0+","+"\""+"nsecs"+"\""+":"+0+"}"+","+"\""+"frame_id"+"\""+":"+"\""+"ss"+"\""+"}"+","+"\""+"height"+"\""+":");

                Sendmessage.append(mOutputFrame.height());
                Sendmessage.append(","+"\""+"width"+"\""+":");
                Sendmessage.append(mOutputFrame.width());
                Sendmessage.append(","+"\""+"encoding"+"\""+":"+"\""+"bgr8"+"\""+","+"\""+"is_bigendian"+"\""+":"+0+","+"\""+"step"+"\""+":");
                Sendmessage.append(mOutputFrame.width()*3);
                Sendmessage.append(","+"\""+"data"+"\""+":");


                Sendmessage.append(b);
                Sendmessage.append("}"+","+"\""+"topic"+"\""+":"+"\""+"/camera/image"+"\""+"}");

                String c1 = new String(Sendmessage);
                System.out.println(c1);
                try {
                    bytedata=c1.getBytes("UTF8");
                    sendData(bytedata);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
        }
       return  mOutputFrame;
    }

    private void sendData(final byte[] data) {
        Thread thread = new Thread(new Runnable() {
            public void run() {
        Socket socket;
        BufferedOutputStream out;
        try {
            socket = new Socket(IP_ADDR, PORT);
            out = new BufferedOutputStream(socket.getOutputStream());
            out.write(data);
            if (out != null) out.close();
            if (socket != null) socket.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
            }
        });
        thread.start();
    }

    @Override
    public void onStart() {
        super.onStart();

    }

    @Override
    public void onStop() {
        super.onStop();

    }
}

Asked by sasadasd on 2017-01-14 12:14:01 UTC

Comments

Answers