Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用http服务器在Android上显示连接到rasberry pi的网络摄像头的图像流_Android_Python_Opencv_Raspberry Pi_Bottle - Fatal编程技术网

使用http服务器在Android上显示连接到rasberry pi的网络摄像头的图像流

使用http服务器在Android上显示连接到rasberry pi的网络摄像头的图像流,android,python,opencv,raspberry-pi,bottle,Android,Python,Opencv,Raspberry Pi,Bottle,我和我的团队正在大学里从事机器人技术项目。我们有一个Rasberry Pi,我们在上面附加了一个网络摄像头,并使用OpenCV进行图像处理。Rasberry Pi进行一些处理,并与船上的Arduino进行通信,然后Arduino继续执行一些有用的操作,如向前移动机器人、转弯等 该项目还涉及制作一个Android应用程序,该应用程序将(除其他外)用于控制机器人,并显示安装在机器人上的摄像头的馈源(连接到Rasberry Pi)。我的问题涉及到解决在我的Android应用程序上显示网络摄像头图像的问

我和我的团队正在大学里从事机器人技术项目。我们有一个Rasberry Pi,我们在上面附加了一个网络摄像头,并使用OpenCV进行图像处理。Rasberry Pi进行一些处理,并与船上的Arduino进行通信,然后Arduino继续执行一些有用的操作,如向前移动机器人、转弯等

该项目还涉及制作一个Android应用程序,该应用程序将(除其他外)用于控制机器人,并显示安装在机器人上的摄像头的馈源(连接到Rasberry Pi)。我的问题涉及到解决在我的Android应用程序上显示网络摄像头图像的问题

为了进行通信,我使用了一个wsgipython框架balltypy()。相关代码(在Rasberry Pi上)为:

这个脚本可以单独运行,或者我可以将这个代码移到我的服务器代码中,但是将它移到服务器代码中会给我带来一些问题,我将用我的android代码解释这些问题

android上的数据流不需要非常平滑。但我是这样做的:

我创建一个runnable并使用一个处理程序每100毫秒调用一次runnable:

runnable = object : Runnable {
        override fun run() {
            /* do what you need to do */
            try {
                val performBackgroundTask = DownloadImageTask(findViewById(R.id.imageView))
                // PerformBackgroundTask this class is the class that extends AsynchTask
                performBackgroundTask.execute("http://$id:8080/static/image.jpg")
            } catch (e: Exception) {
                // TODO Auto-generated catch block
            }
            /* and here comes the "trick" */
            handler.postDelayed(this, 100)
        }
    }
我的异步任务的代码:

class DownloadImageTask(val bmImage: ImageView) : AsyncTask<String,Void,Bitmap>() {

val tag = "DownloadImageTask"

override fun doInBackground(vararg urls: String?): Bitmap? {

    val urldisplay = urls[0]
    var mIcon11: Bitmap? = null
    try {
        val `in` = java.net.URL(urldisplay).openStream()
        if (`in` != null) {
            mIcon11 = BitmapFactory.decodeStream(`in`)
        }
    } catch (e: Exception) {
        Log.e(tag, e.message)
        e.printStackTrace()
    }

    return mIcon11
}

override fun onPostExecute(result: Bitmap?) {
    if (result != null)
        bmImage.setImageBitmap(result)
}
}
服务器仍会持续发送图像一段时间,任何其他请求都会延迟


我需要一个解决方案或者一个完全不同的方法来完成这件事。请帮忙?(很抱歉提出这么长的问题)

经过多次尝试和错误,我找到了最适合我的解决方案

首先,为了获得一致的Jpeg流,我创建了一个Mjpeg流,并使其可以在本地网络(HTTP服务器)上访问。Mjpeg(s)确保序列图像的平滑流动。这比将图像保存到本地存储,然后通过HTTP服务器发送要好得多

这里可以找到Mjpeg服务器的一个示例代码:,另一个是

上述任一示例中的python代码都可以在Rasberry Pi上运行。我更喜欢第二个,因为它允许对流的多个访问

现在对于Android,我使用。这使得Android上的mjpeg流非常容易。然而,我有一些问题。它不适用于所有类型的相机,有时会使我的应用程序崩溃。但我相信我能解决这个问题(换相机有帮助)。此外,我需要启动和停止一个按钮点击流。我还没能做到这一点。它开始,但仅在我退出该活动时停止。还有其他一些项目可以让Android更容易地使用mjpg流媒体,如果我找到更好的,我会更新答案。在那之前,这是一个很好的解决方案

编辑:在Android上显示mjpeg流的另一种更简单的方式: 当我使用WebView时,我会得到最好的结果。要启动流,请使用

webView.loadUrl("http://localhost:8080/cam.mjpeg")
为了更好地适应视频,在您的onCreate功能中:

// All code in Kotlin, for Java, use functions instead of preperty access syntax
webView.settings.loadWithOverviewMode = true;
webView.settings.useWideViewPort = true;
handler.removeCallbacks(runnable)
webView.loadUrl("http://localhost:8080/cam.mjpeg")
// All code in Kotlin, for Java, use functions instead of preperty access syntax
webView.settings.loadWithOverviewMode = true;
webView.settings.useWideViewPort = true;