树莓派摄像头基本操作
本章完成树莓派使用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 }
分类:
Linux 和 树莓派
标签:
Linux 和 树莓派
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异