zoukankan      html  css  js  c++  java
  • 树莓派摄像头基本操作

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

     

  • 相关阅读:
    mysql远程执行sql脚本
    数据库死锁
    sqlserver 数据库之调优
    sqlserver 数据库之性能优化
    Session共享的解决办法
    关于对session机制的理解--通俗易懂
    kafka之常用命令
    分布式消息队列之kafka
    vuejs调试代码
    json
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/9814119.html
Copyright © 2011-2022 走看看