从相机帧获取垫对象Android for OpenCV

hc8w905p  于 2023-01-09  发布在  Android
关注(0)|答案(2)|浏览(116)

我正在开发一个基于OpenCV4Android的教程2的Android应用程序。我想要实现的是当我触摸手机屏幕时获得相机帧的Mat对象(onTouch())。我想修改代码,以便将图像存储为Mat而不是手机内存中的jpeg文件。然后Mat将进行进一步处理。
我需要涉及onCameraFrame()函数吗?任何指导将不胜感激。我是非常新的Android开发和OpenCV以及。
注意:我使用的是Android版本4.2.2和OpenCV2.4.8。

    • 编辑:**

编辑onTouch()onCameraFrame()函数后,代码片段如下:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

        Mat img = inputFrame.rgba();

        if(touched) {
            int imgsize = (int) (img.total()*img.channels());
            byte[] data = new byte[imgsize];
            img.get(0,0,data);
            int col = img.cols();
            int row = img.rows();
            Toast.makeText(this, "size:"+imgsize+" row:"+row+" col:"+col, Toast.LENGTH_SHORT).show();

            StartSocket(row, col, imgsize, data);

            touched = false;
        }

        return img;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i(TAG,"onTouch event"); 
        touched = true;
        return true;
    }

我所做的基本上是将Mat对象转换为一个名为data[]ByteArray,并通过套接字将其与其他信息一起发送到服务器。当我尝试发送文本文件时,套接字作为一个单独的项目工作正常,因此我相信它没有任何问题。
我没有LogCat,因为我直接在我的设备上运行应用程序。

rqcrx0a6

rqcrx0a61#

如果您想处理来自照相机的图像,是的,您需要onCameraFrame()方法,因为它提供您的图像

public class MyActivity extends Activity implements CvCameraViewListener2,OnTouchListener {
    boolean touched=false;
    public boolean onTouch(View v, MotionEvent event) {
         touched = true;
         return true;
    }
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        Mat rgba = inputFrame.rgba();
        if ( touched ) {
            // do some processing on rgba Mat
            touched = false;
        }
        return rgba;
    }
}
b4lqfgs4

b4lqfgs42#

我找到了问题的解决方案。当然,如果没有@berak的帮助,我是不会这么做的。从LogCat中,我发现失败是因为线程的问题。所以我将下面几行从onTouch()移到StartSocket()函数中:

int imgsize = (int) (img.total()*img.channels());
            byte[] data = new byte[imgsize];
            img.get(0,0,data);
            int col = img.cols();
            int row = img.rows();
            Toast.makeText(this, "size:"+imgsize+" row:"+row+" col:"+col, Toast.LENGTH_SHORT).show();

我将把相关的代码片段放在这里,以便其他人使用它。

public class Tutorial3Activity extends Activity implements CvCameraViewListener2, OnTouchListener {

    static TextView msgReceived;
    String serverMsg = "";

    boolean touched = false;

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

        Mat image = inputFrame.rgba();

        if(touched) {
            StartSocket(image); 
            touched = false;
        }

        return image;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Log.i(TAG,"onTouch event"); 
        touched = true;

        return true;
    }

    private void StartSocket(final Mat img) {
        Thread t = new Thread(new Runnable(){

            @Override
            public void run() {
                try {
                    final int imgsize = (int) (img.total()*img.channels());
                    byte[] data = new byte[imgsize];
                    img.get(0,0,data);
                    final int col = img.cols();
                    final int row = img.rows();

                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getBaseContext(), "size:"+imgsize+" row:"+row+" col:"+col, Toast.LENGTH_SHORT).show();
                        }
                    });

                    //--- SEND IMAGE TO SERVER ---//
                    Socket s = new Socket ("192.168.1.25", 6000);

                    DataOutputStream dout = new DataOutputStream(s.getOutputStream());
                    dout.writeInt(col);
                    dout.writeInt(row);
                    dout.writeInt(imgsize);
                    dout.write(data);

                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getBaseContext(), "Dout written", Toast.LENGTH_SHORT).show();
                        }
                    });

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

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

            t.start();
    }

相关问题