欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux開(kāi)發(fā)_攝像頭編程(實(shí)現(xiàn)拍照功能)

DS小龍哥-嵌入式技術(shù) ? 2022-09-17 15:34 ? 次閱讀

這篇文章主要介紹Linux下UVC免驅(qū)攝像頭操作流程,介紹V4L2框架、完成攝像頭拍照保存為BMP圖像到本地,最后貼出了利用CJSON庫(kù)解析天氣預(yù)報(bào)、北京時(shí)間接口返回的數(shù)據(jù)例子代碼(上篇文章的案例補(bǔ)充)。

任務(wù)1:攝像頭操作方式

(1)攝像頭框架介紹

Linux、windows這些系統(tǒng)下很多攝像頭都是免驅(qū)(UVC)。

v4l2 :免驅(qū)攝像頭框架----一堆結(jié)構(gòu)體。

Linux下開(kāi)發(fā)攝像頭的不同角度問(wèn)題:(嵌入式開(kāi)發(fā))

【1】上層軟件系統(tǒng)開(kāi)發(fā)(系統(tǒng)編程),控制驅(qū)動(dòng)提供的接口使用攝像頭。

【2】底層硬件系統(tǒng)開(kāi)發(fā)(驅(qū)動(dòng)編程),直接控制攝像頭采集數(shù)據(jù)。

攝像頭功能:將采集到的圖像數(shù)據(jù)轉(zhuǎn)為二進(jìn)制數(shù)據(jù)返回。

驅(qū)動(dòng)的代碼集成在操作系統(tǒng)里。

在操作系統(tǒng)里使用攝像頭步驟:學(xué)習(xí)接口函數(shù)的調(diào)用。

fread(); read();

Linux下是一切設(shè)備皆文件: 攝像頭、網(wǎng)卡、聲卡、鼠標(biāo)、鍵盤(pán)………………….

Linux下設(shè)備文件存放的位置: /dev目錄下。

在虛擬機(jī)跑Linux,使用外設(shè)設(shè)備都需要單獨(dú)掛載才可以使用。

掛載攝像頭:

img

查看攝像頭的設(shè)備節(jié)點(diǎn):

[root@wbyq /]# ls /dev/video*

/dev/video0 /dev/video1

(2)運(yùn)行網(wǎng)頁(yè)監(jiān)控項(xiàng)目代碼

遠(yuǎn)程網(wǎng)頁(yè)視頻監(jiān)控示例

第一步:編譯libjpeg-turbo
?
1. 解壓:libjpeg-turbo-1.2.1.tar.gz
?
2. 生成Makefile(如果報(bào)錯(cuò),就安裝報(bào)錯(cuò)提示安裝包):./configure
?
3. 編譯安裝:make && make install
?
4. 將生成lib和include目錄下的文件拷貝到/usr目錄下的對(duì)應(yīng)文件夾
?
第二步:編譯mjpg-streamer-r63
?
1.直接make進(jìn)行編譯
?
2.運(yùn)行程序:./mjpg_streamer -i "/work/mjpeg/mjpg-streamer-r63/input_uvc.so -f 10 -r 800*480 -y" -o "/work/mjpeg/mjpg-streamer-r63/output_http.so -w www"
?
注意: 可以使用電腦自帶的攝像頭。在虛擬機(jī)的右下角進(jìn)行將windows系統(tǒng)的攝像頭掛載到Linux系統(tǒng)
?
3. 在瀏覽器里輸入地址進(jìn)行查看攝像頭:
?
例如:192.168.11.123:8080
復(fù)制代碼

將遠(yuǎn)程攝像頭監(jiān)控的代碼編譯運(yùn)行實(shí)現(xiàn)效果。

(1) 修改端口號(hào),8080不能作為公網(wǎng)的端口訪問(wèn)。

(2) 修改線程數(shù)量。

(3) 分析下線程的函數(shù)實(shí)現(xiàn)原理。

(4) 使用花生殼軟件實(shí)現(xiàn)公網(wǎng)監(jiān)控。

花生殼: 將本地IP地址映射為一個(gè)域名。

外網(wǎng)想要訪問(wèn)本地電腦IP就直接訪問(wèn)域名。

(3)攝像頭編程,實(shí)現(xiàn)拍照功能

學(xué)習(xí)攝像頭的使用

(1)攝像頭實(shí)現(xiàn)拍照源程序流程:(50%程序?qū)W過(guò)的)

(2)打開(kāi)攝像頭的設(shè)備文件 open(“/dev/xxx”);

(3)獲取攝像頭參數(shù)。判斷攝像頭是否支持一些特有的操作。read

(4)配置攝像頭的參數(shù)。(1) 輸出的源數(shù)據(jù)格式RGB888 (2) 輸出的圖像尺寸

RGB888:數(shù)字?jǐn)?shù)據(jù)格式

其他格式: YUV 模擬數(shù)據(jù)格式

(5)判斷攝像頭的參數(shù)是否設(shè)置成功。

(6)讀取攝像頭的數(shù)據(jù)。 隊(duì)列的形式。

(7)將讀取的YUV格式數(shù)據(jù)轉(zhuǎn)為RGB格式

(8)將RGB格式數(shù)據(jù)編碼為BMP格式的圖片存放到電腦上

安裝rpm軟件包:rpm -ivh xxxxx.rpm

Linux下安裝軟件有兩種方式:

【1】rpm軟件安裝包(已經(jīng)編譯好的二進(jìn)制文件的集合),使用rpm -ivh xxx.rpm

【2】直接下載源碼包自己編譯安裝。libjpeg-turbo-1.2.1.tar.gz

(1) 沒(méi)有makefile文件,就有: configure文件,用來(lái)生成makefile文件

示例: ./configure

(2) make 編譯源碼

(3) make install 安裝源碼。(會(huì)將編譯好的文件拷貝到指定的目錄下)

img
void *memset(void *s, int c, size_t count) //給指定地址的空間填入指定大小的數(shù)據(jù)
參數(shù):
*s :起始地址
c :填入的數(shù)據(jù)
count :填入的數(shù)量
RGB888 : 000 FFF
復(fù)制代碼

攝像頭拍照示例代碼:

#include "camera_bmp.h"
?
T_PixelDatas Pixedata; //存放實(shí)際的圖像數(shù)據(jù)
?
/*
        USB攝像頭相關(guān)參數(shù)定義
*/
struct v4l2_buffer tV4l2Buf;
int iFd;
int ListNum;
unsigned char* pucVideBuf[4]; // 視頻BUFF空間地址
?
int main(int argc ,char *argv[])
{
    if(argc!=2)
    {
         printf("./app /dev/videoX\n");
         return -1;
    }
    
    camera_init(argv[1]); //攝像頭設(shè)備初始化
?
    //開(kāi)始采集攝像頭數(shù)據(jù),并編碼保存為BMP圖片
    camera_pthread();
    return 0;
}
?
?
//YUV轉(zhuǎn)RGB實(shí)現(xiàn)
unsigned int Pyuv422torgb32(unsigned char * ptr,unsigned int width, unsigned int height)
{
    unsigned int i, size;
    unsigned char Y, Y1, U, V;
    unsigned char *buff = ptr;     //源數(shù)據(jù)
    unsigned char *output_pt=Pixedata.VideoBuf; //存放轉(zhuǎn)換之后的數(shù)據(jù)
    unsigned char r, g, b;
    size = width * height /2;
    for (i = size; i > 0; i--) 
    {
        Y = buff[0];
        U = buff[1];
        Y1= buff[2];
        V = buff[3];
        buff += 4;
        r = R_FROMYV(Y,V);
        g = G_FROMYUV(Y,U,V); //b
        b = B_FROMYU(Y,U); //v
        *output_pt++ = b;
        *output_pt++ = g;
        *output_pt++ = r;
        r = R_FROMYV(Y1,V);
        g = G_FROMYUV(Y1,U,V); //b
        b = B_FROMYU(Y1,U); //v
        *output_pt++ = b;
        *output_pt++ = g;
        *output_pt++ = r;
    }
    return 0;
} 
?
//攝像頭設(shè)備的初始化
int camera_init(char *video)
{
    int i=0;
    int cnt=0;
    //定義攝像頭驅(qū)動(dòng)的BUF的功能捕獲視頻
    int iType = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    
    /* 1、打開(kāi)視頻設(shè)備 */
    iFd = open(video,O_RDWR);
    if(iFd < 0)
?    {
?        printf("攝像頭設(shè)備打開(kāi)失敗!\n");
?        return 0;
?    }
?    
?    struct v4l2_format ?tV4l2Fmt;
?    
?    /* 2、 VIDIOC_S_FMT 設(shè)置攝像頭使用哪種格式 */
?    memset(&tV4l2Fmt, 0, sizeof(struct v4l2_format));
?    tV4l2Fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //視頻捕獲
??
?    //設(shè)置攝像頭輸出的圖像格式
? ? ?tV4l2Fmt.fmt.pix.pixelformat=V4L2_PIX_FMT_YUYV;
??
?    /*設(shè)置輸出的尺寸*/
?    tV4l2Fmt.fmt.pix.width ? ? ? = 640;
?    tV4l2Fmt.fmt.pix.height ? ? ?= 480;
?    tV4l2Fmt.fmt.pix.field ? ? ? = V4L2_FIELD_ANY;
?    
? ? ?//VIDIOC_S_FMT 設(shè)置攝像頭的輸出參數(shù)
? ? ?ioctl(iFd, VIDIOC_S_FMT, &tV4l2Fmt); 
??
?    //打印攝像頭實(shí)際的輸出參數(shù)
?    printf("Support Format:%d\n",tV4l2Fmt.fmt.pix.pixelformat);
?    printf("Support width:%d\n",tV4l2Fmt.fmt.pix.width);
?    printf("Support height:%d\n",tV4l2Fmt.fmt.pix.height);
??
?    /* 初始化Pixedata結(jié)構(gòu)體,為轉(zhuǎn)化做準(zhǔn)備 */
?    Pixedata.iBpp =24;                              
?    //高度 和寬度的賦值
?    Pixedata.iHeight = tV4l2Fmt.fmt.pix.height;
?    Pixedata.iWidth = tV4l2Fmt.fmt.pix.width;
??
?    //一行所需要的字節(jié)數(shù)
?    Pixedata.iLineBytes = Pixedata.iWidth*Pixedata.iBpp/8;
?    //一幀圖像的字節(jié)數(shù)
?    Pixedata.iTotalBytes = Pixedata.iLineBytes * Pixedata.iHeight;
?    Pixedata.VideoBuf=malloc(Pixedata.iTotalBytes); //申請(qǐng)存放圖片數(shù)據(jù)空間
??
?    //v412請(qǐng)求命令
?    struct v4l2_requestbuffers tV4l2ReqBuffs;
?    
?    /* 3、VIDIOC_REQBUFS  申請(qǐng)buffer */
?    memset(&tV4l2ReqBuffs, 0, sizeof(struct v4l2_requestbuffers));
??
?    /* 分配4個(gè)buffer:實(shí)際上由VIDIOC_REQBUFS獲取到的信息來(lái)決定 */
?    tV4l2ReqBuffs.count ? = 4;
?    
?    /*支持視頻捕獲功能*/
?    tV4l2ReqBuffs.type ? ?= V4L2_BUF_TYPE_VIDEO_CAPTURE;
?    
?    /* 表示申請(qǐng)的緩沖是支持MMAP */
?    tV4l2ReqBuffs.memory ?= V4L2_MEMORY_MMAP;
?    
?    /* 為分配buffer做準(zhǔn)備 */
?    ioctl(iFd, VIDIOC_REQBUFS, &tV4l2ReqBuffs);
?    
?    for (i = 0; i < tV4l2ReqBuffs.count; i++) 
?    {
?        memset(&tV4l2Buf, 0, sizeof(struct v4l2_buffer));
?        tV4l2Buf.index = i;
?        tV4l2Buf.type ? = V4L2_BUF_TYPE_VIDEO_CAPTURE;
?        tV4l2Buf.memory = V4L2_MEMORY_MMAP;
??
?        /* 6、VIDIOC_QUERYBUF 確定每一個(gè)buffer的信息 并且 mmap */
?        ioctl(iFd, VIDIOC_QUERYBUF, &tV4l2Buf);
?        //映射空間地址
?        pucVideBuf[i] = mmap(0 /* start anywhere */ ,
?                 ?tV4l2Buf.length, PROT_READ, MAP_SHARED, iFd,
?                 ?tV4l2Buf.m.offset);
?        printf("mmap %d addr:%p\n",i,pucVideBuf[i]);
?    }
??
?    /* 4、VIDIOC_QBUF  放入隊(duì)列*/
? ? ?for (i = 0; i 在LCD上顯示:rgb888 */
?    initLut();
?    printf("開(kāi)始采集數(shù)據(jù).......\n");
?    FD_ZERO(&readfds);
?    FD_SET(iFd,&readfds);
?    select(iFd+1,&readfds,NULL,NULL,NULL);
? ?
?    memset(&tV4l2Buf, 0, sizeof(struct v4l2_buffer));
?    tV4l2Buf.type ? ?= V4L2_BUF_TYPE_VIDEO_CAPTURE; //類(lèi)型
?    tV4l2Buf.memory ?= V4L2_MEMORY_MMAP; //存儲(chǔ)空間類(lèi)型
??
?    /* 9、VIDIOC_DQBUF ?  從隊(duì)列中取出 */
?    error = ioctl(iFd, VIDIOC_DQBUF, &tV4l2Buf); //取出一幀數(shù)據(jù)
?    ListNum = tV4l2Buf.index; //索引編號(hào)
?    
?    //將YUV轉(zhuǎn)換為RGB
?    Pyuv422torgb32(pucVideBuf[ListNum],Pixedata.iWidth,Pixedata.iHeight);
?    
?    //保存BMP
?    save_bmp(Pixedata.VideoBuf); 
?    memset(&tV4l2Buf, 0, sizeof(struct v4l2_buffer));
?    tV4l2Buf.index ?= ListNum;
?    tV4l2Buf.type ? = V4L2_BUF_TYPE_VIDEO_CAPTURE;
?    tV4l2Buf.memory = V4L2_MEMORY_MMAP;
?    error = ioctl(iFd, VIDIOC_QBUF, &tV4l2Buf);
?}
??
??
?/*-----------------保存為BMP格式的圖片------------------*/
?typedef unsigned char ?BYTE;
?typedef unsigned short  WORD;
?typedef unsigned long ?DWORD;
??
?#pragma pack(1)
?typedef struct tagBITMAPFILEHEADER{
? ? ? WORD    ?bfType; ? ? ? ? ? ? ? ?// the flag of bmp, value is "BM"
? ? ? DWORD ? ?bfSize; ? ? ? ? ? ? ? ?// size BMP file ,unit is bytes
? ? ? DWORD ? ?bfReserved; ? ? ? ? ? ?// 0
? ? ? DWORD ? ?bfOffBits; ? ? ? ? ? ? // must be 54  RGB數(shù)據(jù)存放位置
?}BITMAPFILEHEADER;
??
?typedef struct tagBITMAPINFOHEADER{
? ? ? DWORD ? ?biSize; ? ? ? ? ? ?// must be 0x28
? ? ? DWORD ? ?biWidth; ? ? ? ? ? // 寬度
? ? ? DWORD ? ?biHeight; ? ? ? ? ?// 高度
? ? ? WORD ? ? biPlanes; ? ? ? ? ?// must be 1
? ? ? WORD    ?biBitCount; ? ? ? ? ? ?// 像素位數(shù)
? ? ? DWORD ? ?biCompression; ? ? ? ? //
? ? ? DWORD ? ?biSizeImage; ? ? ? //
? ? ? DWORD ? ?biXPelsPerMeter; ? //
? ? ? DWORD ? ?biYPelsPerMeter; ? //
? ? ? DWORD ? ?biClrUsed; ? ? ? ? ? ? //
? ? ? DWORD ? ?biClrImportant; ? ? ? ?//
?}BITMAPINFOHEADER;
??
??
?//保存為BMP格式的文件
?void save_bmp(char *src)
?{
?    /*-----------------------------------------------------------
?                    獲取時(shí)間參數(shù),用來(lái)給圖片命名
?    -------------------------------------------------------------*/
?    time_t t;
? ? ?struct tm *tmp;
? ? ?char buffer[1024] = {0};
? ? ?t = time(NULL);
? ? ?tmp=localtime(&t);
? ? ?if(strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S_", tmp) == 0) 
? ?  {
? ?      printf("timer error\n");
? ?  }
?    
?    static int cnt=0; ? ? ?//靜態(tài)變量存放總數(shù)量
?    cnt++;
?    if(cnt>=20)cnt=0;   //清理計(jì)數(shù)器
    char str[10];
    sprintf(str,"%d",cnt); //整數(shù)轉(zhuǎn)為字符串
    
    strcat(buffer,str);
    strcat(buffer,".bmp");
    printf("%s\n",buffer); //打印圖片的名稱(chēng)
    
    /*-----------------------------------------------------------
                        獲取圖片數(shù)據(jù),用來(lái)保存為BMP圖片格式
    -------------------------------------------------------------*/
  FILE * fp;
  int i;
  BITMAPFILEHEADER  bf;
  BITMAPINFOHEADER  bi;
  
  memset(&bf ,0 ,sizeof(BITMAPFILEHEADER));
  memset(&bi ,0 ,sizeof(BITMAPINFOHEADER));
?
  fp = fopen(buffer, "wb");
  if(!fp)
   {
        printf("open %s error\n",buffer);
        return ;
    }
?
    //Set BITMAPINFOHEADER 設(shè)置BMP信息頭
    bi.biSize = sizeof(BITMAPINFOHEADER);//40;
    bi.biWidth = Pixedata.iWidth;//IMAGEWIDTH;
    bi.biHeight = Pixedata.iHeight;//IMAGEHEIGHT;
    bi.biPlanes = 1;
    bi.biBitCount = 24;//8;
    bi.biCompression = 0;
    bi.biSizeImage =Pixedata.iHeight*Pixedata.iWidth*3; //;0
    bi.biXPelsPerMeter = 0;
    bi.biYPelsPerMeter = 0;
    bi.biClrUsed = 0;// 1<<(bi.biBitCount)
?    bi.biClrImportant = 0;
??
? ? ?//Set BITMAPFILEHEADER
? ? ?bf.bfType = 0x4d42; //'B''M'
? ? ?bf.bfSize = 54 + bi.biSizeImage;// sizeof(BITMAPFILEHEADER); ? ?
? ? ?bf.bfReserved = 0;
? ? ?bf.bfOffBits = 54;
? ? ? ? 
? ? ?fwrite(&bf, sizeof(BITMAPFILEHEADER), 1, fp);
? ? ?fwrite(&bi, sizeof(BITMAPINFOHEADER), 1, fp); ? ?
? ? ?fwrite(src, Pixedata.iWidth*Pixedata.iHeight*3,1,fp);
? ? ?fclose(fp);
?}
??
?/*----------------------YUV轉(zhuǎn)RGB算法-------------------*/
??
?static int *LutYr = NULL;
?static int *LutYg = NULL;;
?static int *LutYb = NULL;;
?static int *LutVr = NULL;;
?static int *LutVrY = NULL;;
?static int *LutUb = NULL;;
?static int *LutUbY = NULL;;
?static int *LutRv = NULL;
?static int *LutGu = NULL;
?static int *LutGv = NULL;
?static int *LutBu = NULL;
??
??
?unsigned char RGB24_TO_Y(unsigned char r, unsigned char g, unsigned char b)
?{
?    return (LutYr[(r)] + LutYg[(g)] + LutYb[(b)]);
?}
??
?unsigned char YR_TO_V(unsigned char r, unsigned char y)
?{
?    return (LutVr[(r)] + LutVrY[(y)]);
?}
??
?unsigned char YB_TO_U(unsigned char b, unsigned char y)
?{
?    return (LutUb[(b)] + LutUbY[(y)]);
?}
??
?unsigned char R_FROMYV(unsigned char y, unsigned char v)
?{
?    return CLIP((y) + LutRv[(v)]);
?}
??
?unsigned char G_FROMYUV(unsigned char y, unsigned char u, unsigned char v)
?{
?    return CLIP((y) + LutGu[(u)] + LutGv[(v)]);
?}
??
?unsigned char B_FROMYU(unsigned char y, unsigned char u)
?{
?    return CLIP((y) + LutBu[(u)]);
?}
??
?void initLut(void)
?{
?    int i;
?    #define Rcoef 299 
?    #define Gcoef 587 
?    #define Bcoef 114 
?    #define Vrcoef 711 //656 //877 
?    #define Ubcoef 560 //500 //493 564
?    
?    #define CoefRv 1402
?    #define CoefGu 714 // 344
?    #define CoefGv 344 // 714
?    #define CoefBu 1772
?    
?    LutYr = malloc(256*sizeof(int));
?    LutYg = malloc(256*sizeof(int));
?    LutYb = malloc(256*sizeof(int));
?    LutVr = malloc(256*sizeof(int));
?    LutVrY = malloc(256*sizeof(int));
?    LutUb = malloc(256*sizeof(int));
?    LutUbY = malloc(256*sizeof(int));
?    
?    LutRv = malloc(256*sizeof(int));
?    LutGu = malloc(256*sizeof(int));
?    LutGv = malloc(256*sizeof(int));
?    LutBu = malloc(256*sizeof(int));
?    for (i= 0;i < 256;i++)
?    {
?     ? ?LutYr[i] = i*Rcoef/1000 ;
?     ? ?LutYg[i] = i*Gcoef/1000 ;
?     ? ?LutYb[i] = i*Bcoef/1000 ;
?     ? ?LutVr[i] = i*Vrcoef/1000;
?     ? ?LutUb[i] = i*Ubcoef/1000;
?     ? ?LutVrY[i] = 128 -(i*Vrcoef/1000);
?     ? ?LutUbY[i] = 128 -(i*Ubcoef/1000);
?     ? ?LutRv[i] = (i-128)*CoefRv/1000;
?     ? ?LutBu[i] = (i-128)*CoefBu/1000;
?     ? ?LutGu[i] = (128-i)*CoefGu/1000;
?     ? ?LutGv[i] = (128-i)*CoefGv/1000;
?    }   
?}
??
??
?void freeLut(void)
?{
?    free(LutYr);
?    free(LutYg);
?    free(LutYb);
?    free(LutVr);
?    free(LutVrY);
?    free(LutUb);
?    free(LutUbY);
?    
?    free(LutRv);
?    free(LutGu);
?    free(LutGv);
?    free(LutBu);
?}
復(fù)制代碼;>

(4)解析北京時(shí)間

#include 
#include 
#include 
#include "cJSON.h"
#include 
#include 
#include 
?
/*
標(biāo)準(zhǔn)時(shí)間運(yùn)行格式: ./app
*/
int GetData(char *src);
int main(int argc,char **argv)
{   
    /*1. 拼接訪問(wèn)的鏈接路徑*/
    char src[200];
    char str[]="http://api.k780.com:88/?app=life.time'&'appkey=10003'&'sign=b59bc3ef6191eb9f747dd4e83c99f2a4'&'format=json >data.txt";
    
    strcpy(src,"curl ");
    strcat(src,str);
    system(src); //執(zhí)行瀏覽器數(shù)據(jù)
    
    /*2. 讀取源數(shù)據(jù)*/
    FILE *file=fopen("data.txt","rb");
    if(file==NULL)
    {
        printf("文件打開(kāi)失敗!\n");
        exit(-1);
    }
    
    struct stat file_stat_buf;
    stat("data.txt",&file_stat_buf); //獲取文件的狀態(tài)
    
    char *src_data=malloc(file_stat_buf.st_size);
    if(src_data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:空間失敗!\n",__FILE__,__LINE__);
        exit(-1);
    }
    
    fread(src_data,1,file_stat_buf.st_size,file); //讀取源數(shù)據(jù)到緩沖區(qū)
    
    /*3. 數(shù)據(jù)解析*/
    GetData(src_data);
    
    /*4. 釋放空間*/
    free(src_data);
    return 0;
}
?
/*
函數(shù)功能:獲取具體的數(shù)據(jù)
函數(shù)形參:保存json的源數(shù)據(jù)首地址
*/
int GetData(char *src)
{
    /*1. 載入源數(shù)據(jù),獲取根對(duì)象*/
    cJSON *root=cJSON_Parse(src);
    if(root==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取根對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    /*2. 獲取對(duì)象中的值*/
    cJSON *json=cJSON_GetObjectItem(root,"success");
    if(json==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    //判斷獲取的值是否成功
    if(strcmp(json->valuestring,"1")!=0)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:時(shí)間獲取失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    
    //獲取結(jié)果
    json=cJSON_GetObjectItem(root,"result");
    if(json==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    //獲取秒單位時(shí)間
    cJSON *data=cJSON_GetObjectItem(json,"timestamp");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("秒單位的時(shí)間:%s\n",data->valuestring);
    
    data=cJSON_GetObjectItem(json,"datetime_1");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("datetime_1:%s\n",data->valuestring);
    
    data=cJSON_GetObjectItem(json,"datetime_2");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("datetime_2:%s\n",data->valuestring);
    
    
    data=cJSON_GetObjectItem(json,"week_1");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("week_1:%s\n",data->valuestring);
    
    
    data=cJSON_GetObjectItem(json,"week_2");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("week_2:%s\n",data->valuestring);
    
    data=cJSON_GetObjectItem(json,"week_3");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("week_3:%s\n",data->valuestring);
    
    data=cJSON_GetObjectItem(json,"week_4");
    if(data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    printf("week_4:%s\n",data->valuestring);
    /* */
    cJSON_Delete(root);
}
復(fù)制代碼

(5)解析天氣預(yù)報(bào)

#include 
#include 
#include 
#include "cJSON.h"
#include 
#include 
#include 
?
/*
標(biāo)準(zhǔn)時(shí)間運(yùn)行格式: ./app
*/
int GetData(char *src);
int main(int argc,char **argv)
{   
    if(argc!=2)
    {
        printf("參數(shù)格式: ./app <城市名稱(chēng)>\n");
        return 0;
    }
    /*1. 拼接訪問(wèn)的鏈接路徑*/
    char src[200];
    char str1[]="http://api.k780.com:88/?app=weather.future'&'weaid=";
    char str2[]="'&&'appkey=10003'&'sign=b59bc3ef6191eb9f747dd4e83c99f2a4'&'format=json >data.txt";
    
    strcpy(src,"curl ");
    strcat(src,str1);
    strcat(src,argv[1]);
    strcat(src,str2);
    
    system(src); //執(zhí)行瀏覽器數(shù)據(jù)
    
    /*2. 讀取源數(shù)據(jù)*/
    FILE *file=fopen("data.txt","rb");
    if(file==NULL)
    {
        printf("文件打開(kāi)失敗!\n");
        exit(-1);
    }
    
    struct stat file_stat_buf;
    stat("data.txt",&file_stat_buf); //獲取文件的狀態(tài)
    
    char *src_data=malloc(file_stat_buf.st_size);
    if(src_data==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:空間失敗!\n",__FILE__,__LINE__);
        exit(-1);
    }
    
    fread(src_data,1,file_stat_buf.st_size,file); //讀取源數(shù)據(jù)到緩沖區(qū)
    
    /*3. 數(shù)據(jù)解析*/
    GetData(src_data);
    
    /*4. 釋放空間*/
    free(src_data);
    return 0;
}
?
/*
函數(shù)功能:獲取具體的數(shù)據(jù)
函數(shù)形參:保存json的源數(shù)據(jù)首地址
*/
int GetData(char *src)
{
    /*1. 載入源數(shù)據(jù),獲取根對(duì)象*/
    cJSON *root=cJSON_Parse(src);
    if(root==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取根對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    /*2. 獲取對(duì)象中的值*/
    cJSON *json=cJSON_GetObjectItem(root,"success");
    if(json==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    //判斷獲取的值是否成功
    if(strcmp(json->valuestring,"1")!=0)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:時(shí)間獲取失敗!\n",__FILE__,__LINE__);
        return -1;
    }
    
    
    //獲取結(jié)果
    json=cJSON_GetObjectItem(root,"result");
    if(json==NULL)
    {
        printf("%s文件第%d行,出現(xiàn)錯(cuò)誤:獲取json對(duì)象失敗!\n",__FILE__,__LINE__);
        return -1;
    }
?
    //獲取數(shù)組大小
    int cnt=cJSON_GetArraySize(json); 
    printf("cnt=%d\n",cnt);
    int i;
    for(i=0;ivaluestring);
        
        p=cJSON_GetObjectItem(data,"days");
        printf("days=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"week");
        printf("week=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"cityno");
        printf("cityno=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"citynm");
        printf("citynm=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"cityid");
        printf("cityid=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"temperature");
        printf("temperature=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"humidity");
        printf("humidity=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"weather");
        printf("weather=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"wind");
        printf("wind=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"winp");
        printf("winp=%s\n",p->valuestring);
        
        p=cJSON_GetObjectItem(data,"winp");
        printf("winp=%s\n",p->valuestring);
        printf("\n\n");
    }
    cJSON_Delete(root);
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11342

    瀏覽量

    210308
  • 攝像頭
    +關(guān)注

    關(guān)注

    60

    文章

    4860

    瀏覽量

    96253
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3637

    瀏覽量

    93948
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    米爾瑞芯微RK3576實(shí)測(cè)輕松搞定三屏八攝像頭

    屏異顯: LVDS實(shí)現(xiàn)接10寸觸摸屏:輸出內(nèi)容為是通過(guò)開(kāi)啟瀏覽器引擎訪問(wèn)米爾網(wǎng)頁(yè) MINI DP接27寸顯示器:輸出內(nèi)容為8路攝像頭捕捉圖像預(yù)覽 HDMI接15寸HDMI顯示器:輸出以基于QT開(kāi)發(fā)
    發(fā)表于 01-17 11:33

    安防監(jiān)控攝像頭氣密性測(cè)試案例-連拓精密#攝像頭氣密檢測(cè)設(shè)備

    攝像頭
    連拓精密科技
    發(fā)布于 :2024年12月11日 15:00:21

    攝像頭及紅外成像的基本工作原理

    本文介紹了攝像頭及紅外成像的基本工作原理,攝像頭可以將看到的圖像真實(shí)的呈現(xiàn)出來(lái),所見(jiàn)即所得! 攝像頭如何工作? 攝像頭可以將看到的圖像真實(shí)的呈現(xiàn)出來(lái),所見(jiàn)即所得。 ? 比如人眼看到的一
    的頭像 發(fā)表于 11-25 09:28 ?786次閱讀
    <b class='flag-5'>攝像頭</b>及紅外成像的基本工作原理

    用于環(huán)視和CMS攝像頭系統(tǒng)的四通道攝像頭應(yīng)用程序

    電子發(fā)燒友網(wǎng)站提供《用于環(huán)視和CMS攝像頭系統(tǒng)的四通道攝像頭應(yīng)用程序.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 10:02 ?0次下載
    用于環(huán)視和CMS<b class='flag-5'>攝像頭</b>系統(tǒng)的四通道<b class='flag-5'>攝像頭</b>應(yīng)用程序

    【飛凌嵌入式OK3576-C開(kāi)發(fā)板體驗(yàn)】 USB攝像頭拍照測(cè)試

    USB攝像頭拍照 將 USB 攝像頭插入開(kāi)發(fā)板,將自動(dòng)安裝 uvc 驅(qū)動(dòng) 使用命令查看usb攝像頭,已經(jīng)將USB
    發(fā)表于 10-10 09:24

    基于FPGA的攝像頭心率檢測(cè)裝置設(shè)計(jì)

    的 OpenCV 等開(kāi)源庫(kù),可以使眾多圖像處理步驟得到簡(jiǎn)化,有利于實(shí)現(xiàn)更復(fù)雜的功能。 2.4 各模塊介紹2.4.1.數(shù)據(jù)采集模塊 使用攝像頭拍攝人臉畫(huà)面,通過(guò) usb 接口與 fpga
    發(fā)表于 07-01 17:58

    esp32是如何與攝像頭連接的呢?

    新手??戳薳sp32的模組中沒(méi)有攝像頭的硬件接口,請(qǐng)問(wèn)它是如何與攝像頭連接的呢
    發(fā)表于 06-28 15:01

    esp32-s2-soala-v1.2如何獲取攝像頭描述符?

    開(kāi)發(fā)板:esp32-s2-soala-v1.2 開(kāi)發(fā)環(huán)境:WIN10 + IDF4.4 我想使用uvc攝像頭的例程,啥都沒(méi)改測(cè)試初始化是成功的,但是獲取圖片后就會(huì)卡死 應(yīng)該是攝像頭沒(méi)有
    發(fā)表于 06-27 06:48

    替換SiTime,汽車(chē)攝像頭可使用國(guó)產(chǎn)可編程振蕩

    替換SiTime,汽車(chē)攝像頭可使用國(guó)產(chǎn)可編程振蕩
    的頭像 發(fā)表于 06-18 09:34 ?328次閱讀
    替換SiTime,汽車(chē)<b class='flag-5'>攝像頭</b>可使用國(guó)產(chǎn)可<b class='flag-5'>編程</b>振蕩

    智能攝像頭抄表器是什么?

    進(jìn)行圖像識(shí)別,實(shí)現(xiàn)無(wú)接觸、無(wú)誤差的遠(yuǎn)程抄表,極大地提高了抄表效率和準(zhǔn)確性。2.技術(shù)原理與優(yōu)勢(shì)2.1AI圖像識(shí)別:智能攝像頭抄表器的核心在于其內(nèi)置的AI算法,能夠準(zhǔn)
    的頭像 發(fā)表于 04-24 14:14 ?722次閱讀
    智能<b class='flag-5'>攝像頭</b>抄表器是什么?

    全志D1-H開(kāi)發(fā)板USB攝像頭拍照Demo

    USB攝像頭拍照Demo 本章節(jié)將講解如何D1-H上使用一個(gè)USB攝像頭拍攝一張照片。 D1-H哪吒開(kāi)發(fā)板上有一個(gè)USB Host接口(即電腦上那種插鼠標(biāo)鍵盤(pán)的USB口),同時(shí)D1-H
    發(fā)表于 03-04 10:48

    爆蘋(píng)果正在探索開(kāi)發(fā)攝像頭的AirPods

    據(jù)知名蘋(píng)果爆料記者馬克?古爾曼消息,蘋(píng)果正在探索開(kāi)發(fā)攝像頭的AirPods。
    的頭像 發(fā)表于 02-27 15:04 ?896次閱讀

    高清網(wǎng)絡(luò)攝像頭多媒體智能屏

    。同時(shí),在屏幕上顯示攝像頭畫(huà)面可直接通過(guò)DGUS開(kāi)發(fā)來(lái)實(shí)現(xiàn),十分快捷。硬件接口展示:產(chǎn)品特點(diǎn)支持通過(guò)以太網(wǎng)、WiFi(2.4GHz、5GHz均可)連接網(wǎng)絡(luò)攝像頭;支
    的頭像 發(fā)表于 02-19 13:21 ?646次閱讀
    高清網(wǎng)絡(luò)<b class='flag-5'>攝像頭</b>多媒體智能屏

    如何使用ESP32攝像頭模塊構(gòu)建簡(jiǎn)單的CCTV安全攝像頭

    我們將向您展示如何使用 ESP32 攝像頭模塊構(gòu)建自己的簡(jiǎn)單 CCTV安全攝像頭。從修改硬件連接到編碼功能和啟用遠(yuǎn)程訪問(wèn),加入我們的分步教程,打造經(jīng)濟(jì)高效且可定制的監(jiān)控解決方案。
    的頭像 發(fā)表于 02-11 11:54 ?7530次閱讀
    如何使用ESP32<b class='flag-5'>攝像頭</b>模塊構(gòu)建簡(jiǎn)單的CCTV安全<b class='flag-5'>攝像頭</b>