[英]C program on Linux to get camera photo
所以我想知道如何从Logitech C270相机中获取照片? 我在下面发布了我的代码,由于起始地址和结束地址相同,因此相机指向的文件似乎为空。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 307200 // number of pixels (640x480 for my webcam)
int main() {
//create files
FILE *camera, *grab;
camera=fopen("/dev/v4l/by-id/usb-046d_0825_1155F490-video-index0", "rb");
//testing files
if(camera==NULL){fputs("\n Can't open camera!",stderr);}
if(feof(camera)){fputs("\n End of file reached!",stderr);}
if(ferror(camera)){fputs("\n The camera has an error!",stderr);}
//stats
rewind (camera); //set position indicator at begining of file
printf("%p is the pos of pointer start\n",&camera); //starting address
fseek(camera,0,SEEK_END);//set position indicator to EndOfFile
printf("%p is the pos of pointer end\n",&camera); //ending address
//running
grab=fopen("grab.raw", "wb");
float data[SIZE];
int n=2; //arbitrary non 0 num to test if fread = 0
n=fread(data, sizeof(data[0]), SIZE, camera);
if(n=0){perror(ERRNO);}
printf(" %d is the state of fread \n",n); //fread's value
fwrite(data, sizeof(data[0]), SIZE, grab);
fclose(camera);
fclose(grab);
return 0;
}
// testing文件中的所有文本都没有出现,我只是得到fread()为0的事实,并且我得到的起始地址和结束地址都相同。 这是什么意思? 谢谢!
您遇到的问题是您正在检查FILE型相机的内存中的地址。 您应该打印的是fpos(camera)。 我对您的工作不怎么了解,但是映像可能是非位置流,更像管道而不是普通磁盘文件。 您还应该检查rewind和fseek的返回码,以查看它们是否无法验证情况。 fread为0的原因是,将文件指针定位到SEEK_END后,您无法倒带相机
相机中的文件与计算机上的文件非常相似。
在其下有一个顶级目录(通常是两个目录)。
最底部目录中的任何视频/图片。
相机中的文件不是仅包含图像的原始二进制文件。
相反,它们是经过格式化的(图片通常是.jpg文件,电影通常是mpg3或mpg4)
较高级别的目录通常是单个条目,因此大小将读取为0。
如果使用文件浏览器访问摄像机,则会看到目录结构。
您的代码需要遵循照相机文件结构。
当代码到达实际的图像或电影时,它可以检查文件扩展名以确定下一步要做什么。
stat()将返回有关文件的详细信息,包括文件的大小。
该stat()信息可以/应该用于为文件分配足够的内存。
然后可以将文件读入结果内存分配中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.