YUY数据转换为RGB数据,并进行灰度化处理显示

BYTE clip255(long Value)
{
 BYTE retValue;
 
 if (Value > 255)
  retValue = 255;
 else if (Value < 0)
  retValue = 0;
 else
  retValue = (BYTE)Value;

return retValue;
}
//win7采到的数据默认YUY格式,一个像素用2位表示,这里将YUY转换为RGB格式(3个字节),便于显示,不转换会出现黑框框
void YUY2_RGB2_ljh(unsigned char* YUY2buff,unsigned char  *RGBbuff,long dwSize)
{
       unsigned char *orgRGBbuff = RGBbuff;
       for( long count = 0; count < dwSize; count += 4 )
       {
              unsigned char Y0 = *YUY2buff;
              unsigned char U = *(++YUY2buff);
              unsigned char Y1 = *(++YUY2buff);
              unsigned char V = *(++YUY2buff);
              ++YUY2buff;
              long Y,C,D,E;
              unsigned char R,G,B;
              Y = Y0;
              C = Y - 16;
              D = U - 128;
              E = V - 128;
              R = clip255(( 298 * C           + 409 * E + 128) >> 8);
              G = clip255(( 298 * C - 100 * D - 208 * E + 128)>> 8);
              B = clip255(( 298 * C + 516 * D           + 128) >> 8);
   *(RGBbuff)   = B;
   *(++RGBbuff) = G;
              *(++RGBbuff) = R;
              Y = Y1;
              C = Y-16;
              D = U-128;
              E = V-128;
              R = clip255(( 298 * C           + 409 * E + 128) >> 8);
              G = clip255(( 298 * C - 100 * D - 208 * E + 128)>> 8);
              B = clip255(( 298 * C + 516 * D           + 128) >> 8);
             *(++RGBbuff) = B;
              *(++RGBbuff) = G;
              *(++RGBbuff) = R;
              ++RGBbuff;
       }
}
//数组按行翻转
void SwapArrayljh2(unsigned char*pS, long dwCount,int width,int height)

{
       char temp;
       long nToSwap = 0;                   // 要交换的序列号
       long nLineSr = 0;                     //当前所在行数
       long nPerLineTotal =width*3;    //  每行的总个数 528

// 先进行  1) 操作
       for(long i = 0; i < dwCount/2; i++)   
       {
              nLineSr  = i/nPerLineTotal;             // 当前所在行数 0--527 第 0 行;528-1057 第1行
              nToSwap=  (height - nLineSr-1)*nPerLineTotal + (i % nPerLineTotal);
              temp= pS[i];
              pS[i]= pS[nToSwap];
              pS[nToSwap]= temp;

}
}
//将数组中数据灰度化处理
void huiDuHua(unsigned char* rgbBuff,long dwSize)
{
 BYTE *pIm;
 int i,j;
 pIm = (BYTE*)malloc(dwSize*sizeof(BYTE));
 j=0;
 for(i=0;i<dwSize;i++)
 {
  pIm[i] = 0.2216*(float)rgbBuff[j+2]+0.7152*(float)rgbBuff[j+1]+0.0722*(float)rgbBuff[j];
  j+=3;
 }
 j=0;
 for(i=0;i<dwSize;i++)
 {
  rgbBuff[j] = pIm[i];
  rgbBuff[j+1] = pIm[i];
  rgbBuff[j+2] = pIm[i];
  j+=3;
 }
 free(pIm);
}

//在这里进行图像处理显示操作
BOOL CVideCapture::DisplayVideoImage(CWnd *ShowWnd, unsigned char VideoDate[], BITMAPINFO bmpInfo)
{
 CRect WndRect;
 ShowWnd->GetWindowRect(WndRect);

CDC* pDC = ShowWnd->GetDC();
 CDC MemDC;
 MemDC.CreateCompatibleDC(pDC);
 CBitmap bmp;
 bmp.CreateCompatibleBitmap(pDC, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight);
 CBitmap *pOldBmp = MemDC.SelectObject(&bmp);

unsigned char *rgbBuff = new unsigned char[bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight*3];
 YUY2_RGB2_ljh(VideoDate,rgbBuff,bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight*2);
 //前一步生成的数据图像是倒立的,进行翻转
 SwapArrayljh2(rgbBuff,bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight*3,bmpInfo.bmiHeader.biWidth,bmpInfo.bmiHeader.biHeight);
 //将彩色数据灰度化
 huiDuHua(rgbBuff,bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight);
 //将数据发送到设备
 if(!::SetDIBitsToDevice(MemDC.GetSafeHdc(),0, 0, bmpInfo.bmiHeader.biWidth, bmpInfo.bmiHeader.biHeight, 0, 0, 0,
  bmpInfo.bmiHeader.biHeight, rgbBuff, &bmpInfo, DIB_RGB_COLORS))
 {
 }
 //显示灰度图像
 pDC->BitBlt(0, 0, WndRect.Width(), WndRect.Height(), &MemDC, 0, 0, SRCCOPY);
 return TRUE;

}

时间: 2024-08-22 05:54:33

YUY数据转换为RGB数据,并进行灰度化处理显示的相关文章

多条Json数据转换为泛型数据

/// <summary> /// 单条json数据转换为实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="str">字符窜(格式为{a:'',b:''})</param> /// <returns></returns> private static T ConvertToEnt

SQLServer之行数据转换为列数据

准备工作 创建表 1 use [test1] 2 go 3 4 create table [dbo].[student]( 5 [id] [int] identity(1,1) not null, 6 [name] [nvarchar](50) null, 7 [project] [nvarchar](50) null, 8 [score] [int] null, 9 constraint [pk_student] primary key clustered 10 ( 11 [id] asc 1

处理YUVNV21数据到RGB数据

1 #define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ 2 #define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ 3 4 #define UB -128 /* max(-128, round(-2.018 * 64)) */ 5 #define UG 25 /* round(0.391 * 64) */ 6 #define VG 52 /* round(0.813 * 64) */ 7

java数据与json数据间的相互转换

java数据格式: class Test{ private String name: private String sex: private String brith: } json数据格式: {"name":"keke","sex":"male","brith":"0301"} 一.Java数据转换为json数据: 1.对象转换 Test test = new Test(); test

从视频文件中读入数据--&gt;将数据转换为灰度图--&gt;对图像做candy边缘检测

//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]){ //预备工作 CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件 i

C#将RGB图像格式数据转换为BITMAP和BITSOURCE对象

1 public void RGBTOBITMAP(BYTE/*自定义的数据IntPtr*/ bits,int width/*图像的宽度*/,int height/*图像的高度*/) 2 int widthStep = width*3; //一般默认步长为宽度的3倍 3 int lenData = widthStep * height;//数据长度,24位图像数据的长度=宽度*高度*3 4 int len = 0; //代表长度 5 //bits图像帧数据 6 byte[] buffer = n

FFmpeg 将YUV数据转RGB

void init() //分配两个Frame,两段buff,一个转换上下文 { //为每帧图像分配内存 m_pFrameYUV = av_frame_alloc(); m_pFrameRGB = av_frame_alloc(); int numBytes = avpicture_get_size(AV_PIX_FMT_RGB32, nwidth,nheight); m_rgbBuffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));

Python将JSON格式数据转换为SQL语句以便导入MySQL数据库

前文中我们把网络爬虫爬取的数据保存为JSON格式,但为了能够更方便地处理数据,我们希望把这些数据导入到MySQL数据库中.phpMyadmin可以把MySQL数据库中的数据导出为JSON格式文件,但却不能把JSON格式文件导入到MySQL数据库.为了实现这个目标,可以编写Python脚本将JSON格式数据转换为SQL语句以便导入MySQL数据库. JSON文件tencent.json部分内容: {"recruitNumber": "1", "name&qu

CUDA 实现JPEG图像解码为RGB数据

了解JPEG数据格式的人应该easy想到.其对图像以8*8像素块大小进行切割压缩的方法非常好用并行处理的思想来实现.而其实英伟达的CUDA自v5.5開始也提供了JPEG编解码的演示样例.该演示样例存储在CUDA的SDK中,即CUDA的默认安装路径"C:\ProgramData\NVDIA Corporation\CUDA Samples\v7.0\7_CUDALibraries\jpegNPP"(v后面的数字依据版本号的不同会变更)中. 该演示样例将图片数据进行了解码和再编码,因为解码