Visual studio 2015 用C++实现树莓Pi相机对树莓Pi HDMI的显示

Visual studio 2015 用C++实现树莓Pi相机对树莓Pi HDMI的显示,visual-studio-2015,raspberry-pi,visualgdb,Visual Studio 2015,Raspberry Pi,Visualgdb,问题:如何将Raspberry Pi摄像头的视频流写入连接HDMI的显示器 回答:请参见下面的我的系统:Raspberry Pi3,Raspbian Jessie分布 VisualGDB和VisualStudio 2015 我花了几个小时整理来自不同帖子的各种测试代码,现在发布这个编译后的测试代码供社区使用。它可以以每秒15帧的速度输出1200x720p的彩色视频 资料来源: 注: VisualGDB在系统根同步方面有一些问题,当我从Visual Studio运行内置操作时,它复制了一堆大小为

问题:如何将Raspberry Pi摄像头的视频流写入连接HDMI的显示器


回答:请参见下面的

我的系统:Raspberry Pi3,Raspbian Jessie分布 VisualGDB和VisualStudio 2015

我花了几个小时整理来自不同帖子的各种测试代码,现在发布这个编译后的测试代码供社区使用。它可以以每秒15帧的速度输出1200x720p的彩色视频

资料来源:

注: VisualGDB在系统根同步方面有一些问题,当我从Visual Studio运行内置操作时,它复制了一堆大小为0的头。相反,我手动将/opt/vc文件夹直接复制到C:\SysGCC\raspberry\arm linux gnueabihf\sysroot

我还必须将libbcm_host.so和libraspicam.so.0.1一起从/opt/vc/lib链接到本地build/Debug/src文件夹

add=/opt/vc/include to includes=表示本地系统室目录 和库名称的主机名

注2:Raspbian发行版或编译器都不喜欢while1循环,因此如果替换for。。。在没有任何退出条件的情况下,使用while1循环绘制框架,您将获得一个用于输出的黑屏。可能的原因是优化器,好的做法是避免出现没有退出条件的无限循环

注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;
}

请将答案贴在答题区,以便保留问题。目前来看,访问此页面的人不知道您正在解决什么问题。
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
    }
}