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

None 来自//testing 文件的文本出现,我只知道 fread() 是 0,并且我得到的起始地址和结束地址相同。这是什么意思? 谢谢!

您遇到的问题是您检查了 FILE 类型相机在内存中的地址。你应该打印的是fpos(相机)。我不知道你在做什么,但图像可能是一个非位置流,比普通磁盘文件更像一个管道。您还应该检查 rewind 和 fseek 中的 return 代码,看看它们是否无法验证情况。 fread 为 0 的原因是因为在将文件指针定位到 SEEK_END

后无法倒带相机

相机中的文件与您计算机上的文件非常相似。

有一个顶级目录(通常)在其下有两个目录。

任何 video/pictures 都在最底部的目录中。

相机中的文件不是只包含图像的原始二进制文件。

相反,它们是格式化的(图片通常是 .jpg 文件,电影通常是 mpg3 或 mpg4)

上层目录(通常)是单个条目,因此大小将为 0。

如果您使用文件浏览器访问相机,您将看到目录结构。

您的代码需要遵循相机文件结构。

当代码到达实际图像或电影时,它可以检查文件扩展名以确定下一步要做什么。

stat() 将 return 有关文件的详细信息,包括其大小。

stat() 信息 can/should 用于为文件分配足够的内存。

然后可以将文件读入分配的内存中。