本章完成樹莓派使用CSI攝像頭拍取照片,拍攝視頻及使用socket進行網絡拍照控制和圖片傳輸功能。
安裝攝像頭
將樹莓派斷電,並將CSI攝像頭接入靠近網孔的排孔中,CSI攝像頭藍色面朝網孔方向。

系統使能攝像頭
執行命令:
sudo raspi-config


拍攝一張照片並查看
拍攝:
raspistill -o new.jpg
查看:
其中xdg-open 為使用系統默認應用打開
xdg-open new.jpg
視頻的錄制
錄制視頻:
raspivid -o vv.h264 -t 10000s
播放可用windows的愛奇藝萬能播放器
實現遠程拍照控制及照片獲取
簡單網絡獲取實時照片實現,建立socket通信,樹莓派用python寫socket服務器,線程監聽端口,Windows用java寫socket客戶端。客戶端連接服務器后發送相關指令調用樹莓派拍照程序進行拍照,然后把照片數據用byte格式傳遞給客戶端,客戶端進行有效接收,並顯示。
其中啟動按鈕為啟動socket客戶端,測試按鈕為測試連接狀態,獲取按鈕為調用拍照指令,程序整體實現較簡單,java客戶端沒有使用線程,所以會有卡頓現象。后續進會進一步調優。
效果展示:

Python代碼實現:

Java代碼實現:
1 import java.awt.Graphics; 2 import java.awt.Image; 3 import java.awt.Toolkit; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.awt.event.WindowAdapter; 7 import java.awt.event.WindowEvent; 8 import java.io.DataInputStream; 9 import java.io.FileNotFoundException; 10 import java.io.FileOutputStream; 11 import java.io.IOException; 12 import java.io.InputStream; 13 import java.io.OutputStream; 14 import java.io.UnsupportedEncodingException; 15 import java.net.Socket; 16 import java.net.UnknownHostException; 17 import javax.swing.ImageIcon; 18 import javax.swing.JButton; 19 import javax.swing.JFrame; 20 import javax.swing.JLabel; 21 import javax.swing.JPanel; 22 23 24 class Main2 extends JFrame{ 25 JLabel jlde; 26 private Image image; //獲取的圖像 27 private Toolkit toolKit; //Toolkit對象,用於獲取圖像 28 private Socket sock; 29 private InputStream reader; 30 private OutputStream writer; 31 private boolean booxie; 32 private DataInputStream dis; 33 JLabel zt; 34 int sizex=0; 35 public Main2(){//構造函數 36 super("圖片獲取實現");//標題顯示內容 37 this.setSize(600, 400);//頁面大小 38 this.setResizable(false);//不可縮放 39 this.setLocationRelativeTo(null);//全屏居中居中顯示 40 jlde=new JLabel(); 41 jlde.setBounds(0, 0,this.getWidth(), this.getWidth()); 42 this.add(jlde); 43 JButton qd=new JButton("啟動"); 44 JButton cs=new JButton("測試"); 45 JButton hq=new JButton("獲取"); 46 JPanel jp=new JPanel(); 47 zt = new JLabel(); 48 jp.add(qd); 49 jp.add(cs); 50 jp.add(hq); 51 jp.add(zt); 52 Imgben("lala.png");//初始圖片顯示 53 this.setIconImage(new ImageIcon("lala.png").getImage());//圖標圖片文件 54 this.add(jp,"South"); 55 this.setVisible(true);//顯示界面 56 qd.addActionListener(new ActionListener(){//-------------------啟動按鈕監聽,開啟socket 57 @Override 58 public void actionPerformed(ActionEvent e) { 59 zt.setText("正在啟動......."); 60 try { 61 62 63 sock=new Socket("192.168.43.243",2351); 64 writer=sock.getOutputStream();//獲取輸出流 65 reader=sock.getInputStream();//獲取輸入流 66 dis = new DataInputStream(sock.getInputStream());//包裝輸入流, 允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型。 67 writer.write(("0").getBytes("GBK"));//發送確認信息 68 reads();//讀數據 69 70 71 } catch (UnknownHostException e1) { 72 e1.printStackTrace(); 73 } catch (IOException e1) { 74 e1.printStackTrace(); 75 }}}); 76 cs.addActionListener(new ActionListener(){//------------------------測試是否連接成功 77 78 @Override 79 public void actionPerformed(ActionEvent e) { 80 try { 81 82 writer.write(("0").getBytes("GBK")); 83 reads(); 84 85 } catch (UnsupportedEncodingException e1) { 86 e1.printStackTrace(); 87 } catch (IOException e1) { 88 e1.printStackTrace(); 89 }}}); 90 hq.addActionListener(new ActionListener(){//-------------------獲取圖片按鈕,點擊可顯示實時圖片 91 @Override 92 public void actionPerformed(ActionEvent e) { 93 try { 94 zt.setText("開始獲取......"); 95 writer.write(("1").getBytes("GBK"));//發送獲取圖片指令 96 reads(); 97 reads(); 98 writer.write(("3").getBytes("GBK"));//發送空的確認獲取指令 99 String str= reads(); 100 sizex=Integer.parseInt(str.substring(str.indexOf("e")+2));//得到圖片大小 101 reads();//讀取圖片數據 102 zt.setText(" 成功獲取 *-* "); 103 Imgben("new.jpg");//顯示獲取的圖片 104 105 } catch (UnsupportedEncodingException e1) { 106 e1.printStackTrace(); 107 } catch (IOException e1) { 108 e1.printStackTrace(); 109 }}}); 110 this.addWindowListener(new WindowAdapter() {//點擊叉監聽,完全退出程序 111 public void windowClosing(WindowEvent arg0) { 112 System.exit(0); 113 } 114 });} 115 public String reads() throws FileNotFoundException{ 116 String strread=""; 117 FileOutputStream fos=null; 118 if(sizex>0){//【 開始接收文件 】 119 fos = new FileOutputStream("new.jpg"); 120 byte[] bytes = new byte[1024]; 121 int length = 0; 122 int bensizej=0; 123 try { 124 while(( length = dis.read(bytes, 0, bytes.length)) != -1) { 125 bensizej+=length; 126 try { 127 fos.write(bytes, 0, length);//以追加的方式寫數據 128 fos.flush(); 129 if(sizex<=bensizej) break;//獲取完成 130 } catch (IOException e) { 131 e.printStackTrace(); 132 } }} catch (IOException e) { 133 e.printStackTrace();} 134 sizex=0; 135 bensizej=0; //清零計數 136 }else{ //【 開始接收普通數據 】 137 byte[] bu=new byte[1024]; 138 try { 139 reader.read(bu); 140 strread=(new String(bu,"GBK")).trim(); 141 System.out.println(strread); 142 zt.setText(strread); 143 } catch (Exception e) { 144 e.printStackTrace(); 145 }} 146 return strread;//返回讀取的普通數據 147 } 148 149 //加載本地圖片 150 public void Imgben(String imagePath){ 151 toolKit = Toolkit.getDefaultToolkit(); 152 repaint(); //重繪屏幕 153 image= toolKit.getImage(imagePath); 154 } 155 public void paint(Graphics g){ 156 super.paint(g); 157 if (image!=null){ 158 image.getScaledInstance(500, 500, Image.SCALE_DEFAULT); 159 ImageIcon ico=new ImageIcon(image); 160 ico.setImage(ico.getImage().getScaledInstance(600,370, Image.SCALE_DEFAULT)); 161 jlde.setIcon(ico); 162 }}} 163 164 public class Main { 165 public static void main(String[] args) { 166 new Main2(); 167 } 168 169 }
