樹莓派攝像頭基本操作


本章完成樹莓派使用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 }

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM