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

📄 cameradata.cpp

📁 camera 驱动源码
💻 CPP
字号:
// CameraData.cpp: implementation of the CCameraData class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "UsbCameraNew.h"
#include "CameraData.h"
#include "ov511_diag.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define mmax(a, b)        ((a) > (b) ? (a) : (b))
#define mmin(a, b)        ((a) < (b) ? (a) : (b))

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCameraData::CCameraData()
{
	RawFrameData = new unsigned char[115223];
	RealFrame    = new unsigned char[115712];
	FrameData    = new unsigned char[230400];
}

CCameraData::~CCameraData()
{
	delete RawFrameData;
	delete RealFrame;
	delete FrameData;
}

int CCameraData::GetRawFrameData()
{
	return CaptureRawFrameData(RawFrameData);
}

void CCameraData::ov511_parse_data_yuv420(unsigned char *pIn0,unsigned char *pOut0, int iOutY, int iOutUV, int iWidth, int iHeight)
{
	int k, l, m;
	unsigned char *pIn;
	unsigned char *pOut, *pOut1;
	unsigned a = iWidth * iHeight;
	unsigned w = iWidth / 2;

	pIn = pIn0;
	pOut = pOut0 + iOutUV + a;
	for (k = 0; k < 8; k++) {
		pOut1 = pOut;
		for (l = 0; l < 8; l++) *pOut1++ = *pIn++;
		pOut += w;
	}

	pIn = pIn0 + 64;
	pOut = pOut0 + iOutUV + a + a/4;
	for (k = 0; k < 8; k++) {
		pOut1 = pOut;
		for (l = 0; l < 8; l++) *pOut1++ = *pIn++;
		pOut += w;
	}

	pIn = pIn0 + 128;
	pOut = pOut0 + iOutY;
	for (k = 0; k < 4; k++) {
		pOut1 = pOut;
		for (l = 0; l < 8; l++) {
			for (m = 0; m < 8; m++)
				*pOut1++ =*pIn++;
			pOut1 += iWidth - 8;
		}
		pOut += 8;
	}
}

void CCameraData::YUV2RGB(int yy, int uu, int vv, int width, int height, int SegNum)
{
	unsigned char y, u, v, seg[384];
	unsigned char *lp_y, *lp_u, *lp_v, *pt;
	int r,g,b;
	int i,j,iSegY = 0, iY, jY , iOutYP, iOutY, iUV, jUV, iOutUVP, iOutUV;

	//以块为单位,转换成标准的yuv420
	pt = RawFrameData;
    for(i = 0; i < SegNum; i++)
	{
		memmove(seg, pt, 384); 
		pt += 384;
		iY = iSegY / 10;
		jY = iSegY - iY * 10;
		iOutYP = iY*8*320 + jY*32;
		iOutY = iOutYP * 3;
		iUV = iSegY / (10 * 2);
		jUV = iSegY - iUV * (10 * 2);
		iOutUVP = iUV*8*2*320 + jUV*16;
		iOutUV = iOutUVP * 3;
		ov511_parse_data_yuv420(seg, RealFrame, iOutYP, iUV*8*160 + jUV*8,
					320, 240);
		iSegY++;
	}



	//将yuv420转换成rgb24
	lp_y = RealFrame + yy;
	lp_u = RealFrame + uu;
	lp_v = RealFrame + vv;


	//YUV转换成RGB
	for(i=0;i<height;i++)
		for(j=0;j<width;j++)
		{
			y=*(lp_y+i*width+j);
			u=*(lp_u+(int)(i/2)*width/2+(int)(j/2));
			v=*(lp_v+(int)(i/2)*width/2+(int)(j/2));
			
			//YUV-》RGB 顺序:b,g,r		
			r=(int)(y+1.402*(v-128));
			g=(int)(y-0.34414*(u-128)-0.71414*(v-128));
			b=(int)(y+1.772*(u-128));

			*(FrameData+(height-i-1)*width*3+j*3+2)=mmin(255,mmax(0,r));
			*(FrameData+(height-i-1)*width*3+j*3+1)=mmin(255,mmax(0,g));
			*(FrameData+(height-i-1)*width*3+j*3)=mmin(255,mmax(0,b));
			
		}

}


⌨️ 快捷键说明

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