질문 : 라스베리 파이 카메라에서 HDMI 연결 디스플레이로 비디오 스트림을 작성하려면 어떻게합니까?라즈베리 파이 HDMI에 표시 CBR을 사용하는 라스베리 파이 카메라에서
답변 :
질문 : 라스베리 파이 카메라에서 HDMI 연결 디스플레이로 비디오 스트림을 작성하려면 어떻게합니까?라즈베리 파이 HDMI에 표시 CBR을 사용하는 라스베리 파이 카메라에서
답변 :
아래 내 시스템 참조 : 나무 딸기 PI3, Raspbian 제시 분배 다른 게시물에서 함께 다양한 테스트 코드를 넣어 몇 시간을 지출 VisualGDB 및으로 VisualStudio 2015
을,이 컴파일 테스트를 게시하도록하겠습니다 커뮤니티가 사용할 코드. 1200x720p 컬러 비디오 출력으로 ~ 15fps까지 작동합니다.
https://visualgdb.com/tutorials/raspberry/camera/
참고 : 나는이 내장 된 비주얼 스튜디오에서 작업, 그것은 크기가 0으로 헤더의 무리를 복사 실행할 때 VisualGDB는 SYSROOT 동기화 몇 가지 문제가 있습니다. 대신, 수동으로 직접 C:\SysGCC\raspberry\arm-linux-gnueabihf\sysroot
에 /opt/vc
폴더를 복사 또한 01,238,523,393에서 (링크 된 튜토리얼로 libraspicam.so.0.1
와 함께) libbcm_host.so
을 복사했다 지역 build/Debug/src
폴더에,
그리고 추가 =/opt/vc/include
포함 (= 지역 sysroom 디렉토리를 나타냅니다) 라이브러리 이름에 그리고 bcm_host
을합니다.
NOTE2 : Raspbian 배포판 또는 어떤 종료 조건없이 while(1)
와 프레임을 그리기위한 for(...)
루프를 교체, 그래서 만약 while(1)
루프를 좋아하지 않는 컴파일러 중 하나, 당신은 출력을 위해 검은 색 화면을 얻을 것이다. 가능한 원인은 최적화 프로그램입니다. 좋은 관행은 종료 조건없이 무한 루프가 발생하지 않도록하는 것입니다.
참고 : 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
}
}
에 게시하시기 바랍니다 예를 들어, 루프 내에서
fbp
포인터를 사용하여 직접 (가장 효율적인 방법을하지 않음) 쓰기, 모든 이미지 처리를 수행하려면 질문이 남을 수 있도록 대답 섹션의 대답. 현재이 페이지를 방문하는 누군가는 당신이 어떤 문제를 해결했는지 알지 못할 것입니다. – csmckelvey알았어, 고마워, – Mich