📄 cameradata.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 + -