├── README.md
├── main
├── res
│ ├── values
│ │ ├── strings.xml
│ │ ├── dimens.xml
│ │ ├── colors.xml
│ │ └── styles.xml
│ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ ├── values-w820dp
│ │ └── dimens.xml
│ └── layout
│ │ └── activity_main.xml
├── AndroidManifest.xml
└── java
│ └── cehua
│ └── hxm
│ └── com
│ └── myvideo
│ ├── MainActivity.java
│ ├── Socket_Client.java
│ └── Base64Util.java
└── t.py
/README.md:
--------------------------------------------------------------------------------
1 | # Python-opencv-Android
2 | 通过python用Socket把图片发送到Android上
3 | 黑小马
4 |
--------------------------------------------------------------------------------
/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | My Video
3 |
4 |
--------------------------------------------------------------------------------
/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/heixiaoma/Python-opencv-Android/master/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/heixiaoma/Python-opencv-Android/master/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/heixiaoma/Python-opencv-Android/master/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/heixiaoma/Python-opencv-Android/master/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/heixiaoma/Python-opencv-Android/master/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/t.py:
--------------------------------------------------------------------------------
1 | import cv2
2 | import numpy as np
3 | import socket
4 | import base64
5 |
6 | # 开启ip和端口
7 | ip_port = ('192.168.0.106', 7999)
8 | # 生成一个句柄
9 | sk = socket.socket()
10 | # 绑定ip端口
11 | sk.bind(ip_port)
12 | # 最多连接数
13 | sk.listen(5)
14 | # 开启死循环
15 | print('server waiting...')
16 | # 等待链接,阻塞,直到渠道链接 conn打开一个新的对象 专门给当前链接的客户端 addr是ip地址
17 | conn, addr = sk.accept()
18 | # 获取客户端请求数据
19 | cap = cv2.VideoCapture(0)
20 | while(1):
21 | # get a frame
22 | ret, frame = cap.read()
23 | # show a frame
24 | cv2.imshow("capture", frame)
25 | cv2.imwrite("temp.jpg", frame)
26 | # 向对方发送数据
27 | f = open(r'temp.jpg', 'rb') # 二进制方式打开图文件
28 | ls_f = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码
29 | print(ls_f)
30 | conn.sendall(ls_f)
31 | conn.sendall(bytes('eof', 'utf8'))
32 | f.close()
33 | if cv2.waitKey(1) & 0xFF == ord('q'):
34 | break
35 | cap.release()
36 | cv2.destroyAllWindows()
37 | # 关闭链接
38 | conn.close()
39 |
40 |
--------------------------------------------------------------------------------
/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/main/java/cehua/hxm/com/myvideo/MainActivity.java:
--------------------------------------------------------------------------------
1 | package cehua.hxm.com.myvideo;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 | import android.util.Log;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.EditText;
9 | import android.widget.ImageView;
10 |
11 | public class MainActivity extends AppCompatActivity {
12 | private Button start_bn;
13 | private EditText ip;
14 | private EditText port;
15 | private ImageView img;
16 | @Override
17 | protected void onCreate(Bundle savedInstanceState) {
18 | super.onCreate(savedInstanceState);
19 | setContentView(R.layout.activity_main);
20 | start_bn=(Button) findViewById(R.id.button);
21 | img=(ImageView)findViewById(R.id.imageView);
22 | ip=(EditText)findViewById(R.id.editText);
23 | port=(EditText)findViewById(R.id.editText2);
24 | start_bn.setOnClickListener(new View.OnClickListener() {
25 | @Override
26 | public void onClick(View v) {
27 | new Socket_Client(ip.getText().toString(),Integer.parseInt(port.getText().toString()),img);
28 | }
29 | });
30 |
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
21 |
22 |
32 |
33 |
41 |
42 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/main/java/cehua/hxm/com/myvideo/Socket_Client.java:
--------------------------------------------------------------------------------
1 | package cehua.hxm.com.myvideo;
2 |
3 |
4 | import android.graphics.Bitmap;
5 | import android.graphics.BitmapFactory;
6 | import android.os.Handler;
7 | import android.os.Message;
8 | import android.util.Log;
9 | import android.widget.ImageView;
10 |
11 | import java.io.*;
12 | import java.net.InetSocketAddress;
13 | import java.net.Socket;
14 | import java.net.SocketAddress;
15 |
16 | public class Socket_Client {
17 | private Socket client;
18 | private String ip;
19 | private int port;
20 | private ImageView img;
21 | private Bitmap bitmap;
22 |
23 | public Socket_Client(String ip, int port, ImageView img) {
24 | Log.e("----------", "构造");
25 | this.ip = ip;
26 | this.port = port;
27 | this.img = img;
28 | new Th().start();
29 | }
30 |
31 | public void client() {
32 | try {
33 | // 创建Socket
34 | client = new Socket();
35 | // 设置发送地址
36 | SocketAddress addr = new InetSocketAddress(ip, port);
37 | // 超时1秒,并连接服务器
38 | client.connect(addr, 30000);
39 | StringBuffer string = new StringBuffer();
40 | //读取服务器发来的数据
41 | while (true) {
42 | InputStream inputStream = client.getInputStream();
43 | int count = 0;
44 | while (count == 0) {
45 | count = inputStream.available();
46 | }
47 | byte[] b = new byte[count];
48 | inputStream.read(b);
49 | String res = new String(b);
50 | if (res.indexOf("eof") > 0) {
51 | string.append(res.substring(0, res.length() - 3));
52 | Log.e("----------", "处理数据中");
53 | bitmap = generateImage(string.toString());
54 | Message m=new Message();
55 | m.what=1;
56 | handler.sendMessage(m);
57 | string.setLength(0);
58 | } else {
59 | string.append(res);
60 | }
61 | }
62 | } catch (Exception e) {
63 | System.out.println(e.getMessage());
64 | }
65 | }
66 |
67 | public static Bitmap generateImage(String imgStr) {
68 | if (imgStr == null)
69 | return null;
70 | try {
71 | // 解密
72 | Log.e("----------", "解密数据");
73 | byte[] b = Base64Util.decode(imgStr);
74 | // 处理数据
75 | for (int i = 0; i < b.length; ++i) {
76 | if (b[i] < 0) {
77 | b[i] += 256;
78 | }
79 | }
80 | if (b.length != 0) {
81 | return BitmapFactory.decodeByteArray(b, 0, b.length);
82 | } else {
83 | return null;
84 | }
85 |
86 | } catch (Exception e) {
87 | return null;
88 | }
89 | }
90 | public Handler handler=new Handler(){
91 | @Override
92 | public void handleMessage(Message msg) {
93 | super.handleMessage(msg);
94 | Log.e("--------","iiiiiiiii");
95 | img.setImageBitmap(bitmap);
96 | }
97 | };
98 | class Th extends Thread {
99 | @Override
100 | public void run() {
101 | super.run();
102 | client();
103 | }
104 | }
105 |
106 |
107 | }
108 |
--------------------------------------------------------------------------------
/main/java/cehua/hxm/com/myvideo/Base64Util.java:
--------------------------------------------------------------------------------
1 | package cehua.hxm.com.myvideo;
2 | import java.io.UnsupportedEncodingException;
3 |
4 | public class Base64Util
5 | {
6 | private static final char last2byte = (char) Integer.parseInt("00000011", 2);
7 | private static final char last4byte = (char) Integer.parseInt("00001111", 2);
8 | private static final char last6byte = (char) Integer.parseInt("00111111", 2);
9 | private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
10 | private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
11 | private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
12 | private static final char[] encodeTable = new char[]
13 | {
14 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
15 | 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
16 | 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
17 | 'Y', 'Z',
18 | 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
19 | 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
20 | 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
21 | 'y', 'z',
22 | '0', '1', '2', '3', '4', '5', '6', '7',
23 | '8', '9',
24 | '+', '/'
25 | };
26 |
27 | public static String encode(String from)
28 | {
29 | return encode(from.getBytes());
30 | }
31 |
32 | public static String encode(byte[] from)
33 | {
34 | StringBuilder to = new StringBuilder((int) (from.length * 1.34) + 3);
35 | int num = 0;
36 | char currentByte = 0;
37 | for (int i = 0; i < from.length; i++)
38 | {
39 | num = num % 8;
40 | while (num < 8)
41 | {
42 | switch (num)
43 | {
44 | case 0:
45 | currentByte = (char) (from[i] & lead6byte);
46 | currentByte = (char) (currentByte >>> 2);
47 | break;
48 | case 2:
49 | currentByte = (char) (from[i] & last6byte);
50 | break;
51 | case 4:
52 | currentByte = (char) (from[i] & last4byte);
53 | currentByte = (char) (currentByte << 2);
54 | if ((i + 1) < from.length)
55 | {
56 | currentByte |= (from[i + 1] & lead2byte) >>> 6;
57 | }
58 | break;
59 | case 6:
60 | currentByte = (char) (from[i] & last2byte);
61 | currentByte = (char) (currentByte << 4);
62 | if ((i + 1) < from.length)
63 | {
64 | currentByte |= (from[i + 1] & lead4byte) >>> 4;
65 | }
66 | break;
67 | }
68 | to.append(encodeTable[currentByte]);
69 | num += 6;
70 | }
71 | }
72 | if (to.length() % 4 != 0)
73 | {
74 | for (int i = 4 - to.length() % 4; i > 0; i--)
75 | {
76 | to.append("=");
77 | }
78 | }
79 | return to.toString();
80 | }
81 |
82 | private static byte[] base64DecodeChars = new byte[]
83 | {
84 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
85 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
86 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
87 | 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
88 | -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
89 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
90 | -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
91 | 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
92 | };
93 |
94 | public static byte[] decode(String str)
95 | {
96 | StringBuffer sb = new StringBuffer();
97 | try {
98 | byte[] data = str.getBytes("US-ASCII");
99 | int len = data.length;
100 | int i = 0;
101 | int b1, b2, b3, b4;
102 | while (i < len)
103 | {
104 | do {
105 | b1 = base64DecodeChars[data[i++]];
106 | } while (i < len && b1 == -1);
107 | if (b1 == -1) break;
108 | do {
109 | b2 = base64DecodeChars
110 | [data[i++]];
111 | } while (i < len && b2 == -1);
112 | if (b2 == -1) break;
113 | sb.append((char) ((b1 << 2) | ((b2 & 0x30) >>> 4)));
114 | do {
115 | b3 = data[i++];
116 | if (b3 == 61) return sb.toString().getBytes("iso8859-1");
117 | b3 = base64DecodeChars[b3];
118 | } while (i < len && b3 == -1);
119 | if (b3 == -1) break;
120 | sb.append((char) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
121 | do {
122 | b4 = data[i++];
123 | if (b4 == 61) return sb.toString().getBytes("iso8859-1");
124 | b4 = base64DecodeChars[b4];
125 | } while (i < len && b4 == -1);
126 | if (b4 == -1) break;
127 | sb.append((char) (((b3 & 0x03) << 6) | b4));
128 | }
129 | return sb.toString().getBytes("iso8859-1");
130 | } catch(UnsupportedEncodingException e) { }
131 | return null;
132 | }
133 | }
134 |
--------------------------------------------------------------------------------