树莓派摄像头基本操作

本章完成树莓派使用CSI摄像头拍取照片,拍摄视频及使用socket进行网络拍照控制和图片传输功能。

 

安装摄像头

将树莓派断电,并将CSI摄像头接入靠近网孔的排孔中,CSI摄像头蓝色面朝网孔方向。

树莓派摄像头基本操作_第1张图片

 

系统使能摄像头

执行命令:

sudo raspi-config

 树莓派摄像头基本操作_第2张图片

树莓派摄像头基本操作_第3张图片

树莓派摄像头基本操作_第4张图片  

 

拍摄一张照片并查看

拍摄:

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客户端没有使用线程,所以会有卡顿现象。后续进会进一步调优。

效果展示:

树莓派摄像头基本操作_第5张图片

 Python代码实现:

 树莓派摄像头基本操作_第6张图片

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 }

 


 

你可能感兴趣的:(树莓派摄像头基本操作)