主题 : 如何视频截图 复制链接 | 浏览器收藏 | 打印
坚持,重复,总结就是成功
级别: 新手上路
UID: 22598
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2010-06-03
最后登录: 2011-01-03
楼主  发表于: 2010-07-29 15:20

 如何视频截图

我想实现视频截图(摄像头为OV9650),该在如何写呢?
下面是OV9650的测试程序,在里面如何加截图程序?
坚持,重复,总结就是成功
级别: 新手上路
UID: 22598
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2010-06-03
最后登录: 2011-01-03
1楼  发表于: 2010-07-29 15:20
%:include <iostream>
%:include <fcntl.h>
%:include <sys/ioctl.h>
%:include <sys/types.h>
%:include <sys/stat.h>
%:include <sys/mman.h>
%:include <unistd.h>
%:include <string.h>
%:include <stdlib.h>
%:include <string.h>
%:include <linux/types.h>
%:include <linux/fb.h>


class TError <%             //类TError
public:                                               //公有属性
    TError(const char *msg) <%
        this->msg = msg;
    %>
    TError(const TError bitand e) <%
        msg = e.msg;
    %>
    void Output() <%
        std::cerr << msg << std::endl;
    %>
    virtual ~TError() <%%>    //空析构函数,属于公有属性
protected:                                           //保护属性
    TError bitand operator=(const TError bitand);      
private:                                             //私有属性
    const char *msg;
%>;

// Linear memory based image
class TRect <%
public:
    TRect():  Addr(0), Size(0), Width(0), Height(0), LineLen(0), BPP(16) <%
    %>
    virtual ~TRect() <%
    %>
    bool DrawRect(const TRect bitand SrcRect, int x, int y) const <%
        if (BPP not_eq 16 or SrcRect.BPP not_eq 16) <%
            // don't support that yet
            throw TError("does not support other than 16 BPP yet");
        %>

        // clip
        int x0, y0, x1, y1;
        x0 = x;
        y0 = y;
        x1 = x0 + SrcRect.Width - 1;
        y1 = y0 + SrcRect.Height - 1;
        if (x0 < 0) <%
            x0 = 0;
        %>
        if (x0 > Width - 1) <%
            return true;
        %>
        if( x1 < 0) <%
            return true;
        %>
        if (x1 > Width - 1) <%
            x1 = Width - 1;
        %>
        if (y0 < 0) <%
            y0 = 0;
        %>
        if (y0 > Height - 1) <%
            return true;
        %>
        if (y1 < 0) <%
            return true;
        %>
        if (y1 > Height - 1) <%
            y1 = Height -1;
        %>

        //copy
        int copyLineLen = (x1 + 1 - x0) * BPP / 8;
        unsigned char *DstPtr = Addr + LineLen * y0 + x0 * BPP / 8;
        const unsigned char *SrcPtr = SrcRect.Addr + SrcRect.LineLen *(y0 - y) + (x0 - x) * SrcRect.BPP / 8;

        for (int i = y0; i <= y1; i++) <%
            memcpy(DstPtr, SrcPtr, copyLineLen);
            DstPtr += LineLen;
            SrcPtr += SrcRect.LineLen;
        %>
        
        
        return true;
    %>

    bool DrawRect(const TRect bitand rect) const <% // default is Center
        return DrawRect(rect, (Width - rect.Width) / 2, (Height - rect.Height) / 2);
    %>

    bool Clear() const <%
        int i;
        unsigned char *ptr;
        for (i = 0, ptr = Addr; i < Height; i++, ptr += LineLen) <%
            memset(ptr, 0, Width * BPP / 8);
        %>
        return true;
    %>

protected:
    TRect(const TRect bitand);
    TRect bitand operator=( const TRect bitand);

protected:
    unsigned char *Addr;
    int Size;
    int Width, Height, LineLen;
    unsigned BPP;
%>;



class TFrameBuffer: public TRect <%
public:
    TFrameBuffer(const char *DeviceName = "/dev/fb0"): TRect(), fd(-1) <%
        Addr = (unsigned char *)MAP_FAILED;

            fd = open(DeviceName, O_RDWR);
        if (fd < 0) <%
            throw TError("cannot open frame buffer");
        %>

            struct fb_fix_screeninfo Fix;
            struct fb_var_screeninfo Var;
        if (ioctl(fd, FBIOGET_FSCREENINFO, bitand Fix) < 0 or ioctl(fd, FBIOGET_VSCREENINFO, bitand Var) < 0) <%
            throw TError("cannot get frame buffer information");
        %>

        BPP = Var.bits_per_pixel;
            if (BPP not_eq 16) <%
            throw TError("support 16BPP frame buffer only");
        %>

            Width  = Var.xres;
            Height = Var.yres;
            LineLen = Fix.line_length;
              Size = LineLen * Height;

        int PageSize = getpagesize();
        Size = (Size + PageSize - 1) / PageSize * PageSize ;
            Addr = (unsigned char *)mmap(NULL, Size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
        if (Addr == (unsigned char *)MAP_FAILED) <%
            throw TError("map frame buffer failed");
            return;
        %>
        ::close(fd);
        fd = -1;

        Clear();
    %>

    virtual ~TFrameBuffer() <%
        ::munmap(Addr, Size);
        Addr = (unsigned char *)MAP_FAILED;

        ::close(fd);
        fd = -1;
    %>

protected:
    TFrameBuffer(const TFrameBuffer bitand);
    TFrameBuffer bitand operator=( const TFrameBuffer bitand);
private:
    int fd;
%>;

class TVideo : public TRect <%
public:
    TVideo(const char *DeviceName = "/dev/camera"): TRect(), fd(-1) <%
        Addr = 0;
        fd = ::open(DeviceName, O_RDONLY);
        if (fd < 0) <%
            throw TError("cannot open video device");
        %>
        Width = 640;
        Height = 512;
        BPP = 16;
        LineLen = Width * BPP / 8;
        Size = LineLen * Height;
        Addr = new unsigned char<:Size:>;

        Clear();
    %>

    bool FetchPicture() const <%
        int count = ::read(fd, Addr, Size);
        if (count not_eq Size) <%
            throw TError("error in fetching picture from video");
        %>
        return true;
    %>

    virtual ~TVideo() <%
        ::close(fd);
        fd = -1;
        delete<::> Addr;
        Addr = 0;
    %>

protected:
    TVideo(const TVideo bitand);
    TVideo bitand operator=(const TVideo bitand);

private:
    int fd;
%>;

int main(int argc, char **argv)
<%
    try <%
        TFrameBuffer FrameBuffer;
        TVideo Video;
        for (;;) <%
            Video.FetchPicture();
            FrameBuffer.DrawRect(Video);
        %>
    %> catch (TError bitand e) <%
        e.Output();
        return 1;
    %>

    return 0;
坚持,重复,总结就是成功
级别: 新手上路
UID: 22598
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2010-06-03
最后登录: 2011-01-03
2楼  发表于: 2010-07-29 15:21
求高人指点。。。。   
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
3楼  发表于: 2010-07-29 17:09
用数码相机拍摄就行了。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
坚持,重复,总结就是成功
级别: 新手上路
UID: 22598
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2010-06-03
最后登录: 2011-01-03
4楼  发表于: 2010-07-29 17:16
是用OV9650摄像,当遇到特殊情况,截图存在SD卡中。。
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
5楼  发表于: 2010-07-29 17:27
那应该是纯软件的事情了,应该有开源的类似软件吧。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
坚持,重复,总结就是成功
级别: 新手上路
UID: 22598
精华: 0
发帖: 23
金钱: 115 两
威望: 23 点
综合积分: 46 分
注册时间: 2010-06-03
最后登录: 2011-01-03
6楼  发表于: 2010-07-30 09:55
不太懂?版主能否说详细点?