树莓派摄像头基本操作
本章完成樹莓派使用CSI攝像頭拍取照片,拍攝視頻及使用socket進(jìn)行網(wǎng)絡(luò)拍照控制和圖片傳輸功能。
?
安裝攝像頭
將樹莓派斷電,并將CSI攝像頭接入靠近網(wǎng)孔的排孔中,CSI攝像頭藍(lán)色面朝網(wǎng)孔方向。
?
系統(tǒng)使能攝像頭
執(zhí)行命令:
sudo raspi-config?
??
?
拍攝一張照片并查看
拍攝:
raspistill -o new.jpg查看:
其中xdg-open 為使用系統(tǒng)默認(rèn)應(yīng)用打開
xdg-open new.jpg?
視頻的錄制
錄制視頻:
raspivid -o vv.h264 -t 10000s播放可用windows的愛奇藝萬能播放器
?
實(shí)現(xiàn)遠(yuǎn)程拍照控制及照片獲取
? ? ? 簡單網(wǎng)絡(luò)獲取實(shí)時照片實(shí)現(xiàn),建立socket通信,樹莓派用python寫socket服務(wù)器,線程監(jiān)聽端口,Windows用java寫socket客戶端。客戶端連接服務(wù)器后發(fā)送相關(guān)指令調(diào)用樹莓派拍照程序進(jìn)行拍照,然后把照片數(shù)據(jù)用byte格式傳遞給客戶端,客戶端進(jìn)行有效接收,并顯示。
? ?其中啟動按鈕為啟動socket客戶端,測試按鈕為測試連接狀態(tài),獲取按鈕為調(diào)用拍照指令,程序整體實(shí)現(xiàn)較簡單,java客戶端沒有使用線程,所以會有卡頓現(xiàn)象。后續(xù)進(jìn)會進(jìn)一步調(diào)優(yōu)。
效果展示:
?Python代碼實(shí)現(xiàn):
?
Java代碼實(shí)現(xiàn):
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(){//構(gòu)造函數(shù) 36 super("圖片獲取實(shí)現(xiàn)");//標(biāo)題顯示內(nèi)容 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());//圖標(biāo)圖片文件 54 this.add(jp,"South"); 55 this.setVisible(true);//顯示界面 56 qd.addActionListener(new ActionListener(){//-------------------啟動按鈕監(jiān)聽,開啟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());//包裝輸入流, 允許應(yīng)用程序以與機(jī)器無關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類型。 67 writer.write(("0").getBytes("GBK"));//發(fā)送確認(rèn)信息 68 reads();//讀數(shù)據(jù) 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(){//-------------------獲取圖片按鈕,點(diǎn)擊可顯示實(shí)時圖片 91 @Override 92 public void actionPerformed(ActionEvent e) { 93 try { 94 zt.setText("開始獲取......"); 95 writer.write(("1").getBytes("GBK"));//發(fā)送獲取圖片指令 96 reads(); 97 reads(); 98 writer.write(("3").getBytes("GBK"));//發(fā)送空的確認(rèn)獲取指令 99 String str= reads(); 100 sizex=Integer.parseInt(str.substring(str.indexOf("e")+2));//得到圖片大小 101 reads();//讀取圖片數(shù)據(jù) 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() {//點(diǎn)擊叉監(jiān)聽,完全退出程序 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);//以追加的方式寫數(shù)據(jù) 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; //清零計數(shù) 136 }else{ //【 開始接收普通數(shù)據(jù) 】 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;//返回讀取的普通數(shù)據(jù) 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 }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/dongxiaodong/p/9814119.html
總結(jié)
以上是生活随笔為你收集整理的树莓派摄像头基本操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop题目(一)
- 下一篇: BZOJ3139/BZOJ1306 HN