小米诚意之作:骁龙8Gen1+IMX766+OIS+120Hz,已跌至两千元档

今天给大家介绍一部小米的诚意之作。在同价位的参数中很抢眼,有特色。废话不多说,数据说话!

本期主角:小米 12

处理器:高通骁龙8 Gen1

相机:后置50MPIMX766主镜头+13MP超广角镜头+5MP长焦微距镜头+ 前置3200万像素前摄+OIS光学防抖+小米影像大脑

屏幕:6.28英寸曲面屏‬+2400x1080像素‬分辨率‬+419PPI +120Hz刷新率+ 480Hz触控采样率

续航:67w有线+ 50w无线+10w无线反向+4500mAh电池

散热:2600平方毫米VC液冷,10345平方毫米石墨,226平方毫米白色石墨烯

扬声器:哈曼卡顿立体声双扬声器+杜比全景声

日常功能:支持NFC 、红外感应

产品重量:180g/179g

其他硬件参数:X轴线性马达

性能方面,采用了骁龙8 Gen1加LPDDR5 +UFS3.1满血版铁三角组合,所以即使运行大型手游也毫无压力,日常使用中可能会感觉性能过剩。同时配合2600平方毫米的VC液冷散热,功耗和性能的良好平衡,两局下来也不会有明显发热的感觉。

小米12采用6.28英寸OLED屏幕,刷新率为120Hz,触控采样率为480Hz。APP界面的日常切换也非常流畅丝滑。12bit原彩显示,精准还原色彩,配上419PPI可以显示更多细节,画面更加细腻。同时,凭借哈曼卡顿立体声双扬声器和直线电机的震撼配置,日常生活中看小说、直播、追剧也会有不错的体验。

内置4500mAh电池,以及67w有线充电、50w无线充电、10w无线反向充电。有三重快充的加持,半小时即可充满。

影像方面也在线。后置50MP的主镜头,采用索尼IMX766传感器,支持光学防抖。有小米影像大脑的加持,相机的启动、拍摄和成像速度每个阶段均有显著提升,日常拍摄体验很好,喜欢发朋友圈的朋友们再也不用辛苦修图。

以上就是今天的全部内容了,欢迎大家点赞评论转发哦。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取海康威视摄像头的源码,需要先了解一下摄像头的型号和接口类型。如果是USB接口的摄像头,可以使用V4L2(UVC)驱动来进行操作。如果是CSI接口的摄像头,需要根据具体的型号和规格书来开发对应的驱动程序。以下是一个使用V4L2驱动的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <sys/ioctl.h> #include <linux/videodev2.h> #define CAMERA_DEVICE "/dev/video0" #define CAPTURE_FILE "frame.raw" #define IMAGE_WIDTH 640 #define IMAGE_HEIGHT 480 struct buffer { void *start; size_t length; }; static void errno_exit(const char *s) { fprintf(stderr, "%s error %d, %s\n", s, errno, strerror(errno)); exit(EXIT_FAILURE); } static int xioctl(int fd, int request, void *arg) { int r; do { r = ioctl(fd, request, arg); } while (-1 == r && EINTR == errno); return r; } static void process_image(const void *p, int size) { FILE *fp; fp = fopen(CAPTURE_FILE, "wb"); if (fp) { fwrite(p, size, 1, fp); fclose(fp); } } static int read_frame(int fd, struct buffer *buffers) { struct v4l2_buffer buf; CLEAR(buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf)) { switch (errno) { case EAGAIN: return 0; case EIO: default: errno_exit("VIDIOC_DQBUF"); } } process_image(buffers[buf.index].start, buf.bytesused); if (-1 == xioctl(fd, VIDIOC_QBUF, &buf)) errno_exit("VIDIOC_QBUF"); return 1; } static void mainloop(int fd, struct buffer *buffers) { unsigned int count; count = 100; while (count-- > 0) { for (;;) { fd_set fds; struct timeval tv; int r; FD_ZERO(&fds); FD_SET(fd, &fds); tv.tv_sec = 2; tv.tv_usec = 0; r = select(fd + 1, &fds, NULL, NULL, &tv); if (-1 == r) { if (EINTR == errno) continue; errno_exit("select"); } if (0 == r) { fprintf(stderr, "select timeout\n"); exit(EXIT_FAILURE); } if (read_frame(fd, buffers)) break; } } } static void stop_capturing(int fd) { enum v4l2_buf_type type; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl(fd, VIDIOC_STREAMOFF, &type)) errno_exit("VIDIOC_STREAMOFF"); } static void start_capturing(int fd, struct buffer *buffers) { unsigned int i; enum v4l2_buf_type type; for (i = 0; i < 4; ++i) { struct v4l2_buffer buf; CLEAR(buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf)) errno_exit("VIDIOC_QUERYBUF"); buffers[i].length = buf.length; buffers[i].start = mmap(NULL /* start anywhere */, buf.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, fd, buf.m.offset); if (MAP_FAILED == buffers[i].start) errno_exit("mmap"); } for (i = 0; i < 4; ++i) { struct v4l2_buffer buf; CLEAR(buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = i; if (-1 == xioctl(fd, VIDIOC_QBUF, &buf)) errno_exit("VIDIOC_QBUF"); } type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl(fd, VIDIOC_STREAMON, &type)) errno_exit("VIDIOC_STREAMON"); } static void uninit_device(struct buffer *buffers) { unsigned int i; for (i = 0; i < 4; ++i) if (-1 == munmap(buffers[i].start, buffers[i].length)) errno_exit("munmap"); } static void init_mmap(int fd, struct buffer **buffers, unsigned int *n_buffers) { struct v4l2_requestbuffers req; CLEAR(req); req.count = 4; req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; req.memory = V4L2_MEMORY_MMAP; if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) { if (EINVAL == errno) { fprintf(stderr, "%s does not support " "memory mapping\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } else { errno_exit("VIDIOC_REQBUFS"); } } if (req.count < 2) { fprintf(stderr, "Insufficient buffer memory on %s\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } *buffers = calloc(req.count, sizeof(**buffers)); if (!*buffers) { fprintf(stderr, "Out of memory\n"); exit(EXIT_FAILURE); } for (*n_buffers = 0; *n_buffers < req.count; ++*n_buffers) { struct v4l2_buffer buf; CLEAR(buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_MMAP; buf.index = *n_buffers; if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf)) errno_exit("VIDIOC_QUERYBUF"); (*buffers)[*n_buffers].length = buf.length; (*buffers)[*n_buffers].start = mmap(NULL /* start anywhere */, buf.length, PROT_READ | PROT_WRITE /* required */, MAP_SHARED /* recommended */, fd, buf.m.offset); if (MAP_FAILED == (*buffers)[*n_buffers].start) errno_exit("mmap"); } } static void init_device(int fd) { struct v4l2_capability cap; struct v4l2_format fmt; if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &cap)) { if (EINVAL == errno) { fprintf(stderr, "%s is no V4L2 device\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } else { errno_exit("VIDIOC_QUERYCAP"); } } if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { fprintf(stderr, "%s is no video capture device\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } if (!(cap.capabilities & V4L2_CAP_STREAMING)) { fprintf(stderr, "%s does not support streaming i/o\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } CLEAR(fmt); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = IMAGE_WIDTH; fmt.fmt.pix.height = IMAGE_HEIGHT; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; if (-1 == xioctl(fd, VIDIOC_S_FMT, &fmt)) errno_exit("VIDIOC_S_FMT"); if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV) { fprintf(stderr, "Libv4l only supports V4L2_PIX_FMT_YUYV format\n"); exit(EXIT_FAILURE); } } int main(int argc, char *argv[]) { struct buffer *buffers; unsigned int n_buffers; int fd = open(CAMERA_DEVICE, O_RDWR | O_NONBLOCK, 0); if (-1 == fd) { fprintf(stderr, "Cannot open %s\n", CAMERA_DEVICE); exit(EXIT_FAILURE); } init_device(fd); init_mmap(fd, &buffers, &n_buffers); start_capturing(fd, buffers); mainloop(fd, buffers); stop_capturing(fd); uninit_device(buffers); close(fd); return 0; } ``` 这个程序会从摄像头中获取视频流,并将每一帧保存到文件中。您需要根据自己的需求进行修改。需要注意的是,这个程序只适用于使用V4L2驱动的摄像头,如果您使用的是CSI接口的摄像头,需要开发对应的驱动程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值