⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 camtest.cpp

📁 2440开发板的cmos摄像头应用程序
💻 CPP
字号:
%: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 <%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 imageclass 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;%>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -