2017-03-31 150 views

回答

1

我的系統:覆盆子PI3,Raspbian傑西分佈 VisualGDB和VisualStudio的2015年

花幾個小時把來自不同崗位在一起的各種測試代碼,我張貼這種編譯測試社區使用的代碼。它工作在〜15fps,1200x720p彩色視頻輸出。

來源: https://raspberrypi.stackexchange.com/questions/7092/display-a-test-pattern-by-writing-the-frame-buffer-and-then-clear-it

https://visualgdb.com/tutorials/raspberry/camera/

注: VisualGDB有SYSROOT同步的一些問題,當我跑內置的從Visual Studio操作,複製一系列的頭大小爲0。相反,我手動複製/opt/vc文件夾C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot直接

我也有來自(在鏈接的教程,libraspicam.so.0.1一起爲)複製當地build/Debug/src文件夾,

並添加=/opt/vc/include到包括(=指示本地sysroom目錄) 而bcm_host到庫名。

NOTE2:要麼Raspbian發行或編譯器不喜歡while(1)循環,因此,如果您更換for(...)循環繪製與while(1)幀沒有任何退出條件,你會得到一個黑色的屏幕輸出。可能的原因是優化程序,最好的做法是避免出現完全沒有退出條件的無限循環。注3:如果使用HDMI輸出以小於1280x720的分辨率(小於相機視頻流)進行監視,則可能會發生一些問題,尋找某人編輯較小屏幕的代碼。具有複合視頻輸出的舊版RPi也未經過測試。

感謝,

#include <stdio.h> 
#include <syslog.h> 
#include <fcntl.h> 
#include <linux/fb.h> 
#include <sys/mman.h> 
#include <sys/ioctl.h> 
#include "interface\vmcs_host\vc_dispmanx_types.h" 
#include <bcm_host.h> 
#include "raspicam.h" 
#include <iostream> 


typedef struct 
{ 
    DISPMANX_DISPLAY_HANDLE_T display; 
    DISPMANX_MODEINFO_T   info; 
    void      *image; 
    DISPMANX_UPDATE_HANDLE_T update; 
    DISPMANX_RESOURCE_HANDLE_T resource; 
    DISPMANX_ELEMENT_HANDLE_T element; 
    uint32_t     vc_image_ptr; 

} RECT_VARS_T; 

int main(int argc, char **argv) 
{ 
    RECT_VARS_T vars; 
    VC_RECT_T src_rect; 
    VC_RECT_T dst_rect; 
    VC_DISPMANX_ALPHA_T alpha = { 
     static_cast<DISPMANX_FLAGS_ALPHA_T>(DISPMANX_FLAGS_ALPHA_FROM_SOURCE | DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS), 
     255, /*alpha 0->255*/ 
     0 
    }; 

    bcm_host_init(); 

    vars.display = vc_dispmanx_display_open(0); 
    vc_dispmanx_display_get_info(vars.display, &vars.info); 

    //Grab Camera feed 
    raspicam::RaspiCam v_camera; //camera object 
    //Open camera 
    std::cout << "Opening Camera..." << std::endl; 
    if (!v_camera.open()) 
    { 
     std::cerr << "Error opening camera" << std::endl; 
     return -1; 
    } 
    //may need to wait a while until camera stabilizes 

    int cam_width = v_camera.getWidth(); 
    int cam_height = v_camera.getHeight(); 

    vars.image = calloc(1, cam_width * cam_height * 3); 
    vars.resource = vc_dispmanx_resource_create(VC_IMAGE_RGB888, 
     cam_width, 
     cam_height, 
     &vars.vc_image_ptr); 

    vc_dispmanx_rect_set(&dst_rect, 0, 0, cam_width, cam_height); 
    vars.update = vc_dispmanx_update_start(10); 
    vars.element = vc_dispmanx_element_add(vars.update, 
     vars.display, 
     2000, // layer 
     &dst_rect, 
     vars.resource, 
     &src_rect, //may not need this 
     DISPMANX_PROTECTION_NONE, 
     &alpha, 
     NULL, // clamp 
     static_cast<DISPMANX_TRANSFORM_T>(0)); 

    //Draw 50 frames to screen 
    for (int i = 0; i < 50; i++) 
    {  
     vc_dispmanx_resource_write_data(vars.resource, 
      VC_IMAGE_RGB888, 
      cam_width * 3, 
      vars.image, 
      &dst_rect); 

     unsigned char* fbp = static_cast<unsigned char*>(vars.image); 
     v_camera.grab(); 
     v_camera.retrieve(fbp, raspicam::RASPICAM_FORMAT_RGB);//get camera image 
     vc_dispmanx_update_submit_sync(vars.update); 
    } 

    int ret = vc_dispmanx_resource_delete(vars.resource); 
    vc_dispmanx_display_close(vars.display); 

    return true; 
} 

如果要執行任何圖像處理,只寫直接使用內循環fbp指針,例如(不是最有效的方法)

int location_cam = 0; 
for (int x = 200; x < 300; x++) 
{  
    for (int y = 200; y < 300; y++) 
    { 
     location_cam = (x) * (3) + (y) * cam_width * 3; 
     *(fbp + location_cam) = 255;  //red 
     *(fbp + location_cam + 1) = 0;  //green 
     *(fbp + location_cam + 2) = 0; //blue 
    } 
} 
+0

請郵寄至答案部分的答案可以保留問題。現在,有人訪問此頁面並不知道你正在解決什麼問題。 – csmckelvey

+0

明白了,謝謝, – Mich