Android OpenCV通过socket传输图像

标签 android sockets opencv mat

我正在使用 OpenCV for Android 编写一个套接字,将图像传输到用 Python 编写的服务器。

此应用程序基于 OpenCV for Android v2.4.8 给出的教程 3。它的工作原理如下:当用户触摸屏幕时,会捕获图像并将其存储在手机的内部存储器中。然后通过套接字传输该图像。

问题是在捕获图像后套接字连接永远不会建立,我不明白为什么。这是onTouch(View v, MotionEvent event)

的代码 fragment
@SuppressLint("SimpleDateFormat")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i(TAG,"onTouch event");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        String currentDateandTime = sdf.format(new Date());
        fileName = Environment.getExternalStorageDirectory().getPath() +
                               "/sample_picture_" + currentDateandTime + ".jpg";
        mOpenCvCameraView.takePicture(fileName);
        Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();

        StartSocket();

        return false;
    }

这里是 StartSocket() 的代码。请注意,我已在另一个 Android 应用程序中尝试使用此代码通过套接字发送文本文件并且成功。

private void StartSocket() {

        Log.d("SEND","about to imread the img");
        img = Highgui.imread(fileName);
        Log.d("SEND","just finished with imread");

        Thread t = new Thread(new Runnable(){

            @Override
            public void run() {
                try {   
                    Socket s = new Socket("192.168.19.128", 6000);

                    //--- SEND IMAGE TO SERVER ---//

                    byte[] data = new byte[(int) (img.total()*img.channels())];
                    img.get(0,0,data);

                    DataOutputStream dout = new DataOutputStream(s.getOutputStream());
                    dout.write(data);
                    dout.flush();


                    //--- RECEIVE TEXT FROM SERVER ---//
                    int charsRead = 0;
                    char[] buffer = new char[1024];

                        Log.d("RECEIVE","about to receive");

                        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        while ((charsRead = in.read(buffer)) != -1) {
                            serverMsg += new String(buffer).substring(0, charsRead);
                            Log.d("Received char",serverMsg);
                        }
                        Log.d("Received msg",serverMsg); */

                        mHandler.post(new Runnable() {

                            @Override
                            public void run() {
                                msgReceived = (TextView) findViewById(R.id.msgReceived);
                                msgReceived.setText(serverMsg);
                            }
                        });

                        dout.close();
                        s.close(); //close socket

                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

            t.start();
    }

任何人都可以指导我未建立套接字连接的原因是什么?请注意,所有必要的权限都已添加到 list 中。

最佳答案

我发现问题出在网络上。我在基于 Linux 的虚拟机上运行服务器,该虚拟机未与 LAN 桥接。 所以放弃我的代码的其他问题(比如在服务器端接收到损坏的图像),套接字连接成功建立。

关于Android OpenCV通过socket传输图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23548553/

相关文章:

python - 使用python在打开的cv中使用鼠标事件绘制填充的多边形

opencv - 测试基本矩阵

android - Android应用程序更新会在Play控制台统计信息中生成重新安装报告

android - Nougat 上未调用 TelephonyManager 的 PhoneStateListener

java - Netty 4 中的阻塞

windows - Office 2010 中的 VBA 套接字连接

python - opencv中读取并显示多张图像

android - 使用 android AudioRecord 获取 32 位样本?

java - 使用 JSON 从 API 获取数据并将两个对象存储在数组适配器的单行中

java - 为什么输入流以 block 的形式读取数据?