0
A
回答
1
我的系統:覆盆子PI3,Raspbian傑西分佈 VisualGDB和VisualStudio的2015年
花幾個小時把來自不同崗位在一起的各種測試代碼,我張貼這種編譯測試社區使用的代碼。它工作在〜15fps,1200x720p彩色視頻輸出。
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
}
}
相關問題
- 1. 樹莓派上的USB攝像頭
- 2. 將樹莓派攝像頭饋送到Darknet和Yolo
- 3. 使用Raspberry Pi上的攝像頭進行運動檢測
- 4. MJPG流與樹莓派和網絡攝像頭
- 5. 從外部攝像頭捕獲圖像,並將其存儲在樹莓派3
- 6. Raspberry Pi C++頭文件
- 7. 樹莓pi不會顯示pil圖片
- 8. 視頻阻擋Raspberry PI HDMI控制檯
- 9. GPIO在樹莓派c#
- 10. 在樹莓派2上使用opencv C++
- 11. startx不啓動,樹莓派
- 12. Open CV無法從Raspberry Pi上的USB攝像頭讀取幀
- 13. Raspberry Pi:檢測聲音並觸發攝像頭
- 14. 啓用HDMI端口後,使用外殼編程在樹莓派禁用它3
- 15. 在樹莓派上使用qt顯示ip地址
- 16. 上樹莓派2
- 17. 樹莓PI
- 18. 使用外部攝像頭的攝像頭顯示預覽
- 19. 樹莓派B +內存顯示爲247Mb
- 20. JavaFX Raspberry Pi UI未顯示
- 21. OpenCV Raspberry Pi printf()不顯示
- 22. Raspberry Pi C++ I2C/SPI示例
- 23. 設置樹莓派
- 24. 與樹莓派GPIO
- 25. 如何訪問一個攝像頭在樹莓派運動,而不是使用端口
- 26. 檢查樹莓派
- 27. 在液晶顯示器上顯示樹莓派時鐘
- 28. 樹莓派安裝sailsJS
- 29. opencv的:無法打開顯示:C++,樹莓裨無頭連接
- 30. 從Java程序運行的Bash捕獲網絡攝像頭圖像上樹莓派
請郵寄至答案部分的答案可以保留問題。現在,有人訪問此頁面並不知道你正在解決什麼問題。 – csmckelvey
明白了,謝謝, – Mich