樹莓派攝像頭基本操作
本樹莓派攝像頭實現完成裡樹莓派CSI攝像頭拍取照片,拍攝視訊及簡單的網路圖片圖片傳輸功能。
第一步:
將樹莓派斷電,並將CSI攝像頭接入靠近網孔的排孔中,CSI攝像頭藍色面朝網孔方向。
第二步:
使能攝像頭,命令sudo raspi-config
第三步:
拍攝一張照片並檢視
拍攝:raspistill -o new.jpg
檢視:xdg-open new.jpg # xdg-open 為系統預設應用開啟
第四步:
錄製視訊:raspivid -o vv.h264 -t 10000s
播放可用windows的愛奇藝萬能播放器
第五步:
簡單網路獲取實時照片實現,建立socket通訊,樹莓派用python寫socket伺服器,執行緒監聽埠,Windows用java寫socket客戶端。客戶端連線伺服器後傳送相關指令呼叫樹莓派拍照程式進行拍照,然後把照片資料用byte格式傳遞給客戶端,客戶端進行有效接收,並顯示。
其中啟動按鈕為啟動socket客戶端,測試按鈕為測試連線狀態,獲取按鈕為呼叫拍照指令,程式整體實現較簡單,java沒有使用執行緒,所以會有卡頓現象。
附件:
# Python程式碼:
//Java程式碼:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
class Main2 extends JFrame{
JLabel jlde;
private Image image; //獲取的影象
private Toolkit toolKit; //Toolkit物件,用於獲取影象
private Socket sock;
private InputStream reader;
private OutputStream writer;
private boolean booxie;
private DataInputStream dis;
JLabel zt;
int sizex=0;
public Main2(){//建構函式
super("圖片獲取實現");//標題顯示內容
this.setSize(600, 400);//頁面大小
this.setResizable(false);//不可縮放
this.setLocationRelativeTo(null);//全屏居中居中顯示
jlde=new JLabel();
jlde.setBounds(0, 0,this.getWidth(), this.getWidth());
this.add(jlde);
JButton qd=new JButton("啟動");
JButton cs=new JButton("測試");
JButton hq=new JButton("獲取");
JPanel jp=new JPanel();
zt = new JLabel();
jp.add(qd);
jp.add(cs);
jp.add(hq);
jp.add(zt);
Imgben("lala.png");//初始圖片顯示
this.setIconImage(new ImageIcon("lala.png").getImage());//圖示圖片檔案
this.add(jp,"South");
this.setVisible(true);//顯示介面
qd.addActionListener(new ActionListener(){//-------------------啟動按鈕監聽,開啟socket
@Override
public void actionPerformed(ActionEvent e) {
zt.setText("正在啟動.......");
try {
sock=new Socket("192.168.43.243",2351);
writer=sock.getOutputStream();//獲取輸出流
reader=sock.getInputStream();//獲取輸入流
dis = new DataInputStream(sock.getInputStream());//包裝輸入流, 允許應用程式以與機器無關方式從底層輸入流中讀取基本 Java 資料型別。
writer.write(("0").getBytes("GBK"));//傳送確認資訊
reads();//讀資料
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}}});
cs.addActionListener(new ActionListener(){//------------------------測試是否連線成功
@Override
public void actionPerformed(ActionEvent e) {
try {
writer.write(("0").getBytes("GBK"));
reads();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}}});
hq.addActionListener(new ActionListener(){//-------------------獲取圖片按鈕,點選可顯示實時圖片
@Override
public void actionPerformed(ActionEvent e) {
try {
zt.setText("開始獲取......");
writer.write(("1").getBytes("GBK"));//傳送獲取圖片指令
reads();
reads();
writer.write(("3").getBytes("GBK"));//傳送空的確認獲取指令
String str= reads();
sizex=Integer.parseInt(str.substring(str.indexOf("e")+2));//得到圖片大小
reads();//讀取圖片資料
zt.setText(" 成功獲取 *-* ");
Imgben("new.jpg");//顯示獲取的圖片
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}}});
this.addWindowListener(new WindowAdapter() {//點選叉監聽,完全退出程式
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});}
public String reads() throws FileNotFoundException{
String strread="";
FileOutputStream fos=null;
if(sizex>0){//【 開始接收檔案 】
fos = new FileOutputStream("new.jpg");
byte[] bytes = new byte[1024];
int length = 0;
int bensizej=0;
try {
while(( length = dis.read(bytes, 0, bytes.length)) != -1) {
bensizej+=length;
try {
fos.write(bytes, 0, length);//以追加的方式寫資料
fos.flush();
if(sizex<=bensizej) break;//獲取完成
} catch (IOException e) {
e.printStackTrace();
} }} catch (IOException e) {
e.printStackTrace();}
sizex=0;
bensizej=0; //清零計數
}else{ //【 開始接收普通資料 】
byte[] bu=new byte[1024];
try {
reader.read(bu);
strread=(new String(bu,"GBK")).trim();
System.out.println(strread);
zt.setText(strread);
} catch (Exception e) {
e.printStackTrace();
}}
return strread;//返回讀取的普通資料
}
//載入本地圖片
public void Imgben(String imagePath){
toolKit = Toolkit.getDefaultToolkit();
repaint(); //重繪螢幕
image= toolKit.getImage(imagePath);
}
public void paint(Graphics g){
super.paint(g);
if (image!=null){
image.getScaledInstance(500, 500, Image.SCALE_DEFAULT);
ImageIcon ico=new ImageIcon(image);
ico.setImage(ico.getImage().getScaledInstance(600,370, Image.SCALE_DEFAULT));
jlde.setIcon(ico);
}}}
public class Main {
public static void main(String[] args) {
new Main2();
}
}