繁体   English   中英

Linux上的C程序获取相机照片

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM