`
M_ittrue
  • 浏览: 76984 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

C:Android camera S:PC opencV阶段总结

阅读更多
     最近在跟一学长在合作开发一项目,以PC这Server端,Android为Client端,通过调用Android HTC的Camera获取图片帧数据,利用Socket与Server建立的无线连接将数据进行传输,Server以C++编程为基础对传回来的数据恢原,并以opencV作为核心技术处理,进期阶段是想实现图片的自动识别,后期阶段是对移动物体的更高精确实别,该项目最初定义,属于一类实事监控软件。

    由于Android方面的低子比较薄,而学长在opencV方面已有建树,所以,我们打算协同攻克AndroidClient端。下面,让我来浅谈我们的开发过程(该项目现在只处于初级阶段)。

    项目不是写出来的,而是一步一步测试出来的。无可非议,一条最基本的C/S连接是必须的。一般的Android软件开发,我想都会经过三个开台的。一:PC android AVD(模拟器)二:embedded (嵌入式) 三:嵌入式程序移植到真机

我们是直接不经过第二步的,毕竟我们的项目目的是just for fun. 为减少模拟器上所得的可执行.apk程序能较快移植到HTC真机上测试,我们应用了第三方基于WIFI数据转输软件-discover;建立连接中,Socket网络编程还是老方法,基于TCP/IP协议
// 创建Socket
					socket = new Socket("192.168.1.90", 54321);
           			Log.v("Conection", "Conection Success!");//这是android中的调试语句
					// 向服务器发送消息
					PrintWriter out = new PrintWriter(new BufferedWriter(
							new OutputStreamWriter(socket.getOutputStream())),
							true);
					out.println(message);
					// 接收来自服务器的消息
					BufferedReader br = new BufferedReader(
							new InputStreamReader(socket.getInputStream()));
					String msg = br.readLine();

   在手机上运行一个程序,很多都会涉及到手机相关底层线程的权限应用,我们最初同样忽略了这一点以致于调试了半天。是的,相信你已经猜出来。我们还必须在AndroidManifest.xml里面进行权限配置,在接下来的Camera使用也同样要配置权限的。
这样,手机客户端就可以发送信息了,服务器也能较容接收到信息。
我们可以把AndroidManifest转换到xml格式然后加入一句:
<uses-permission android:name="android.permission.INTERNET" />

   接下来,我们就改变发送信息的类型。我们第二次是用位图作为发送数据,当然,为了较快见到成效,最好使用小一点的,在Android中只支持位图与png,jpeg的转换。我们是先预置一张jpeg格式的图片在res/drawable-hdpi/icon.jpeg中,然后通过R.drawable.icon获取资android自动为icon分配的资源标识去调用图片的。然后将其转化为Bitmap位图,以三通道格式进行解释,最后把相关数据发送,服务器端自然是按照已定的协议进行还原,显示。
//将图片读入
        		InputStream is = getResources().openRawResource(R.drawable.icon); 
        		//把图片转换为位图
                Bitmap mBitmap = BitmapFactory.decodeStream(is);
                byte type = 1;//定义数据协议类型
                //获取位图的宽和高
                int Width = mBitmap.getWidth();
                int Height = mBitmap.getHeight();
                //该方法效率虽高,但是传入的pixels必须是int数组,为降低内存消耗且先用以下办法
                //mBitmap.getPixels(pixels, offset, stride, x, y, width, height);
              //存储位图像素的数组
              byte[] imagedata = new byte[3*Width*Height];
              for(int row=0;row<Width;row++)
              for(int col=0;col<Height;col++){
              		int index =  3*(Width*row+col);
              		int argb=mBitmap.getPixel(row, col);
              		//位运算,因为在服务器端rgb位置是刚好相反的
              	    byte r = (byte)((argb>>16)&0xff);
              	    byte g = (byte)((argb>>8)&0xff);
              	    byte b = (byte)((argb)&0xff);
              		imagedata[index + 0] = r;
              	    imagedata[index + 1] = g;
              	    imagedata[index + 2] = b;
              }
              //按协议发送数据
              dos.writeByte(type);
              dos.writeInt(Width);
              dos.writeInt(Height);
              dos.write(imagedata);
          	Log.v("flymessage", "Success!!");      
      		socket.close();

    接下来我们就要去从HTC的摄像头中获取一帧帧的图片发送给服务端,并形成一视频流。
对不起大家,现在才来更新。我们的进度已经去到了获得视频流的阶段,相应的技术点,让我一一向大家道来.
    在实现这一过程中,我们遇到了最不想看到的时间,硬件问题.由于我们拿来做测试的真机并不是行货,导致程序在模拟器上能运行,但在真机上运行时,最关键获得位图信息data[]的方法却根本没有被调用,经过上网查找,才知道这是版本问题。我们曾试过降低版本,甚至对机子进行刷机,依然没有得到很好的解决,最终,只能等等行货机的出实...
    终于,一部Mo的里程杯出现了...
    对于上面所说的技术点,随着项目的进度,我们都做了相应的修改。主要还是集中在对图象的处这块上,很明显,图象的获取以及处理是我们的关键技术.在android中,从camera上获得的原始数据是YCbCr_420_SP,当然,这个可能会因版本的不同不有所差异。为了保真同时更易于我们的解码,我们试把它改成MPGE/RGBA888等熟悉的编码方式,结果,事与愿违。在服务端上我们用的是C++语言,两种语言对付同一种编码,总是难以达到最好的效果。有时失真度很大,更有时根本无法传送。这一直是我们苦恼的问题。有时程序在模拟器上能运行,在真正上却不行,我们怀疑是权限的问题。然后,想要修改这一格式只要获得camera的权限既可,这个我们是在一开始就获得了的,寻找解决问题的方法中...
    由于项目是想从手机获得图片后,再进行图片的处理,因此对图片的色彩要求并不高,也就是说,就算是黑白图片,也已经满足要求.所以,我们就只获取黑白图片得了,在整个data[]中Withd*heigh前面是RGB数据,后面是A透明度数据(也就是色彩数据),因此我们只抽获了前面的部分,接下来的就简单多了,也就是socket数据通信...
    嗯,补充一点,虽然是只要黑白图片,但原始数据是YCbCr_420_SP,所以简单的处理是必要的,这些方法,在我的其它文章里可以找得到,至于服务器实现,大家可以联系我与我讨论,阶段性的说明已经完毕,我会在以后继续把我的项目进展告诉大家(当然,包括大家想知道的技术关键实现),话不多说(其实说了很多),谢谢观看..
1
3
分享到:
评论
2 楼 ihopethatwell 2012-01-05  
期待更详细
1 楼 sunleije 2011-02-14  
重点没有啊,想看识别怎么和opencv交互的

相关推荐

    安卓Android源码——将手机摄像头获取的图片通过wifi发送到PC机上并进行显示.zip

    这篇教程主要介绍的是如何在Android平台上利用源代码实现从手机摄像头获取图像,并通过WiFi网络将这些图像实时传输到PC上进行显示。这个功能对于开发者来说非常有用,例如在远程监控、实时图像分析或者多媒体共享等...

    Android PC机摄像头摄像数据在Android手机上同步显示的源.zip源码资源下载

    该资源是一个实现Android设备与PC机之间摄像头视频流同步显示的项目。主要涉及的技术栈包括Android、Java以及可能使用的Apache相关库。以下是对这个项目的关键知识点的详细解释: 1. **Android开发**:项目基于...

    android视频监控源码(带服务器)

    这个项目中,"android视频监控源码(带服务器)"提供了Android客户端与PC服务器之间的实时视频传输解决方案。接下来,我们将深入探讨相关知识点。 1. Android客户端:在Android设备上,使用Camera API或Camera2 API...

    android视频采集

    1. **Android多媒体框架**:Android提供了丰富的多媒体框架,包括Camera API(分为Camera1和Camera2)以及MediaRecorder,用于视频采集、预览和录制。Camera1 API适用于较旧版本的Android系统,而Camera2 API是新...

    android摄像头监控

    同时,PC端需要解码接收到的数据,可能需要用到FFmpeg或者OpenCV等库,将接收到的H.264流转换回原始图像帧。 "MonitorPcServer"可能包含了PC端的服务器程序,用于接收和处理来自Android设备的视频流。这部分代码...

    android局域网视频聊天

    6. **框架与库**:在Android上,开发者可能会使用开源库如libyuv进行图像处理,或者使用OpenCV进行高级的计算机视觉功能。对于网络传输,可以选择使用WebRTC(Web Real-Time Communication),这是一个开源项目,...

    Unity扫描QR码源代码 支持Androi IOS PC

    Unity是一款强大的跨平台游戏开发引擎,它被...这个“Unity扫描QR码源代码”项目提供了一个完整的解决方案,让开发者可以在Unity中轻松集成二维码扫描功能,覆盖Android、iOS和PC平台,大大提高了开发效率和用户体验。

    精典源码之将手机摄像头获取的图片通过wifi发送到PC机上并进行显示.rar

    在Android中,我们可以使用Camera API(旧版)或Camera2 API(新版)来获取摄像头数据。在iOS中,通常使用AVFoundation框架来访问摄像头。 2. 图像捕获:捕获图像后,通常会以JPEG或其他常见图像格式保存。这涉及到...

    Android在视频监控中的研究与应用.pdf

    Android系统自带的Camera组件用于视频录制,确保实时性。为保证数据传输,视频数据从显示缓存中逐帧读取,通过WiFi连接,利用Socket通信方式将视频帧发送到PC服务器端,实现视频同步。这样可以实现实时监控,并与...

    以Android设备为基础的白光光通信技术.pdf

    &lt;uses-permission android:name="android.permission.CAMERA" /&gt; &lt;uses-permission android:name="android.permission.FLASHLIGHT" /&gt; ``` 为了保证应用的兼容性和可查询性,应当在程序中添加硬件测试标签,并确保...

    一个电脑连接安卓手机,并获取视频实时图像监控

    这需要利用Android SDK中的Camera API或者更现代的Camera2 API来访问和控制设备的摄像头。开发者需要编写代码来开启摄像头,调整分辨率、帧率等参数,以适应网络传输,并确保视频质量。此外,为了实时传输,可能还...

Global site tag (gtag.js) - Google Analytics