void bgr2yuv(BYTE *pYUVFrame, RGBTRIPLE *pRGBFrame, int width, int height) { int i,j; int r,g,b; __u8 y,u,v; int num = 0; int yuv_offset = 0; BYTE pRGB[3]; BYTE pYUV[3]; for(i=height-1; i>=0; i--) { for(j=0;j<width;j++) { pRGB[0]=pRGBFrame[i*width+j].B; pRGB[1]=pRGBFrame[i*width+j].G; pRGB[2]=pRGBFrame[i*width+j].R; RGB2YUV(pRGB,pYUV); y = pYUV[0]; u = pYUV[1]; v = pYUV[2]; pYUVFrame[yuv_offset++] = y; if(num%2 == 0) { pYUVFrame[yuv_offset++] = u; } else { pYUVFrame[yuv_offset++] = v; } num++; } } }
void bayerGBRG_to_yuv422planar_nearest_neighbour(const unsigned char *bayer, unsigned char *yuv, unsigned int width, unsigned int height) { unsigned char *y = yuv; unsigned char *u = YUV422_PLANAR_U_PLANE(yuv, width, height); unsigned char *v = YUV422_PLANAR_V_PLANE(yuv, width, height); const unsigned char *b = bayer; int y1, u1, v1, y2, u2, v2; int t1, t2; for ( unsigned int h = 0; h < height; h += 2) { // g b ... line for (unsigned int w = 0; w < width; w += 2) { t1 = b[width]; t2 = b[1]; RGB2YUV(t1, *b, t2, y1, u1, v1); ++b; t1 = b[width - 1]; t2 = b[-1]; RGB2YUV(t1, t2, *b, y2, u2, v2); ++b; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // r g ... line for (unsigned int w = 0; w < width; w += 2) { t1 = b[1]; t2 = b[-width+1]; RGB2YUV(*b, t1, t2, y1, u1, v1); ++b; t1 = b[-1]; t2 = b[-width]; RGB2YUV(t1, *b, t2, y2, u2, v2); ++b; assign(y, u, v, y1, u1, v1, y2, u2, v2); } } }
void ColorGuiFrame::OnClick(wxMouseEvent &event) { int r, g, b, y, u, v; int px = (event.m_x/scale_) + ((scale_pos_x_*scale_) - scale_pos_x_)/scale_; int py = (event.m_y/scale_) + ((scale_pos_y_*scale_) - scale_pos_y_)/scale_; r = rgb_image_[py * (width_ * 3) + px * 3 + 0]; g = rgb_image_[py * (width_ * 3) + px * 3 + 1]; b = rgb_image_[py * (width_ * 3) + px * 3 + 2]; std::ostringstream stream1; stream1 << "(" << r << ", " << g << ", " << b << ")"; rgbText_->SetValue(wxString::FromAscii(stream1.str().c_str())); RGB2YUV(r, g, b, y, u, v); int y_low, y_high, u_low, u_high, v_low, v_high; vision_->getThreshold(0, y_low, y_high, u_low, u_high, v_low, v_high); if (y_low == 0 && y_high == 0) { y_low = y; y_high = y; } if (u_low == 0 && u_high == 0) { u_low = u; u_high = u; } if (v_low == 0 && v_high == 0) { v_low = v; v_high = v; } y_low = std::min(y, y_low); y_high = std::max(y, y_high); u_low = std::min(u, u_low); u_high = std::max(u, u_high); v_low = std::min(v, v_low); v_high = std::max(v, v_high); vision_->setThreshold(0, y_low, y_high, u_low, u_high, v_low, v_high); std::ostringstream stream; stream << "( " << y_low << ":" << y_high << ", " << u_low << ":" << u_high << ", " << v_low << ":" << v_high << " ) "; yuvText_->SetValue(wxString::FromAscii(stream.str().c_str())); }
static inline void rgb2yuy2 (unsigned char *RGB, unsigned char *YUV, uint32_t NumPixels) { int i, j; register int y0, y1, u0, u1, v0, v1 ; register int r, g, b; for (i = 0, j = 0; i < 3 * NumPixels; i += 6, j += 4) { r = RGB[i + 0]; g = RGB[i + 1]; b = RGB[i + 2]; RGB2YUV (r, g, b, y0, u0 , v0); r = RGB[i + 3]; g = RGB[i + 4]; b = RGB[i + 5]; RGB2YUV (r, g, b, y1, u1 , v1); YUV[j + 0] = y0; YUV[j + 1] = (u0+u1)/2; YUV[j + 2] = y1; YUV[j + 3] = (v0+v1)/2; } }
int mlt_convert_rgb24a_to_yuv422(uint8_t *rgba, int width, int height, int stride, uint8_t *yuv, uint8_t *alpha) { int ret = 0; register int y0, y1, u0, u1, v0, v1; register int r, g, b; register uint8_t *d = yuv; register int i, j; if(alpha) for(i = 0; i < height; i++) { register uint8_t *s = rgba + (stride * i); for(j = 0; j < (width / 2); j++) { r = *s++; g = *s++; b = *s++; *alpha++ = *s++; RGB2YUV(r, g, b, y0, u0, v0); r = *s++; g = *s++; b = *s++; *alpha++ = *s++; RGB2YUV(r, g, b, y1, u1, v1); *d++ = y0; *d++ = (u0 + u1) >> 1; *d++ = y1; *d++ = (v0 + v1) >> 1; } if(width % 2) { r = *s++; g = *s++; b = *s++; *alpha++ = *s++; RGB2YUV(r, g, b, y0, u0, v0); *d++ = y0; *d++ = u0; } } else for(i = 0; i < height; i++) {
void bayerRGGB_to_yuv422planar_nearest_neighbour(const unsigned char *bayer, unsigned char *yuv, unsigned int width, unsigned int height) { unsigned char *y = yuv; unsigned char *u = YUV422_PLANAR_U_PLANE(yuv, width, height); unsigned char *v = YUV422_PLANAR_V_PLANE(yuv, width, height); const unsigned char *b = bayer; int y1, u1, v1, y2, u2, v2; for ( unsigned int h = 0; h < height; h += 2) { // r g ... line for (unsigned int w = 0; w < width; w += 2) { RGB2YUV(*b, b[1], b[width+1], y1, u1, v1); ++b; RGB2YUV(b[-1], *b, b[width], y2, u2, v2); ++b; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // g b ... line for (unsigned int w = 0; w < width; w += 2) { RGB2YUV(*(b-width), *b, b[1], y1, u1, v1); ++b; RGB2YUV(*(b-width-1), b[-1], *b, y2, u2, v2); ++b; assign(y, u, v, y1, u1, v1, y2, u2, v2); } } }
/** * @brief convert rgb to yuv * * @author wangxi * @date 2012-07-05 * @param[in] color888 RGB888 * @return T_U32 * @retval yuv420 */ T_U32 ColorConvert_RgbToYuv(T_U32 color888) { T_U8 R = 0; T_U8 G = 0; T_U8 B = 0; T_U8 Y = 0; T_U8 U = 0; T_U8 V = 0; B = (T_U8)color888; // B G = (T_U8)(color888 >> 8); // G R = (T_U8)(color888 >> 16); // R RGB2YUV(Y, U, V, R, G, B); return ((V<<16) | (U<<8) | Y); }
void rtspStream::SendData(unsigned char* data ,int size,int type,RTSPStreamHandle lpParam)//type:0-RGB;1-YUV { rtspStream* pStream = (rtspStream*)lpParam; unsigned long ul =pStream->m_nWidth * pStream->m_nHeight *1.5; switch(type) { case 0: //RGB data needs to be translated into YUV data RGB2YUV(data,pStream->m_nWidth,pStream->m_nHeight,pStream->pLoadBuf,&ul); break; case 1: // YUV data memcpy(pStream->pLoadBuf,data,size); break; } SetEvent(pStream->m_hSendEvent); //pStream->GetOneFrame(); }
void AvgColSegmentator::AssignColor(int i, int j, CvScalar *color) { int segCount = cvmGet(m_SegmentCount, i,j); if (0 && segCount == 1) { for (int n=0; n<m_nScribbles; n++) { if (cvmGet(m_Segmentations[n],i,j)) { RGB2YUV(m_scribbles[n].GetColor(), color); return; } } } // Assigned to multiple segmentations // Average out colors of all assigned scribbles CvScalar scrYUV; double val[3]; { double probCount = 0; val[0] = 0; val[1] = 0; val[2] = 0; double maxProb = 0; double minProb = 1000; double sumProb = 0; for (int n=0; n<m_nScribbles; n++) { double prob = (cvmGet(m_Probabilities[n],i,j)); if (prob < minProb) minProb = prob; if (prob > maxProb) maxProb = prob; sumProb += prob; } for (int n=0; n<m_nScribbles; n++) { double prob = maxProb-(cvmGet(m_Probabilities[n],i,j))+minProb; //double prob = sumProb-(cvmGet(m_Probabilities[n],i,j)); // Give more weight to selected scribbles if (cvmGet(m_Segmentations[n],i,j)) prob *= 10; //printf("Prob[%d]=%lf\n", n,prob); RGB2YUV(m_scribbles[n].GetColor(), &scrYUV); val[0] += scrYUV.val[0] * prob; val[1] += scrYUV.val[1] * prob; val[2] += scrYUV.val[2] * prob; probCount += prob; } val[0] /= probCount; val[1] /= probCount; val[2] /= probCount; color->val[0] = val[0]; color->val[1] = val[1]; color->val[2] = val[2]; } }
// 转换RGB void CRGB2YUVView::OnConvertPAL() { CDC *pDC = GetDC(); CRect rect; CBrush brush(RGB(128,128,128)); GetClientRect(&rect); pDC->FillRect(&rect, &brush); // PAL 720x576 : 中国的电视标准为PAL制 int CurrentXRes = 720; int CurrentYRes = 576; int size = CurrentXRes * CurrentYRes; // 分配内存 byte *Video_Field0 = (byte*)malloc(CurrentXRes*CurrentYRes); byte *Video_Field1 = (byte*)malloc(CurrentXRes*CurrentYRes); // 保存内存指针 byte *Video_Field0_ = Video_Field0; byte *Video_Field1_ = Video_Field1; byte yuv_y0, yuv_u0, yuv_v0, yuv_v1; // {y0, u0, v0, v1}; byte bufRGB[3]; // 临时保存{R,G,B} byte bufYUV[3]; // 临时保存{Y,U,V} // 初始化数组空间 ZeroMemory(bufRGB, sizeof(byte)*3); ZeroMemory(bufYUV, sizeof(byte)*3); // 初始化内存 ZeroMemory(Video_Field0, CurrentXRes*CurrentYRes); ZeroMemory(Video_Field1, CurrentXRes*CurrentYRes); // BMP 位图操作 BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; char strFileName[MAX_PATH]="720bmp.bmp"; CFile* f; f = new CFile(); f->Open(strFileName, CFile::modeRead); f->SeekToBegin(); f->Read(&bmfh, sizeof(bmfh)); f->Read(&bmih, sizeof(bmih)); // 分配图片像素内存 RGBTRIPLE *rgb; rgb = new RGBTRIPLE[bmih.biWidth*bmih.biHeight]; f->SeekToBegin(); f->Seek(54,CFile::begin); // BMP 54个字节之后的是位像素数据 f->Read(rgb, bmih.biWidth * bmih.biHeight * 3); // 这里只读24位RGB(r,g,b)图像 // 上场 (1,3,5,7...行) for (int i = bmih.biHeight-1; i>=0; i--) { for (int j = 0; j<bmih.biWidth; j++) { if(!(i%2)==0) { bufRGB[0] = rgb[i*bmih.biWidth+j].rgbtRed; // R bufRGB[1] = rgb[i*bmih.biWidth+j].rgbtGreen; // G bufRGB[2] = rgb[i*bmih.biWidth+j].rgbtBlue; // B // RGB转换为YUV RGB2YUV(bufRGB,bufYUV); yuv_y0 = bufYUV[0]; // y yuv_u0 = bufYUV[1]; // u yuv_v0 = bufYUV[2]; // v for (int k=0; k<1000; k++) ; //延时 // 视图中显示 pDC->SetPixel(j, (bmih.biHeight-1)-i, RGB(bufRGB[0], bufRGB[1], bufRGB[2])); // UYVY标准 [U0 Y0 V0 Y1] [U1 Y2 V1 Y3] [U2 Y4 V2 Y5] 每像素点两个字节,[内]为四个字节 if ((j%2)==0) { *Video_Field0 = yuv_u0; Video_Field0++; yuv_v1 = yuv_v0; // v保存起来供下一字节使用 } else { *Video_Field0 = yuv_v1; Video_Field0++; } *Video_Field0 = yuv_y0; Video_Field0++; }// end if i%2 } } // 下场 (2,4,6,8...行) for (int i_ = bmih.biHeight-1; i_>=0; i_--) { for (int j_ = 0; j_<bmih.biWidth; j_++) { if((i_%2)==0) { bufRGB[0] = rgb[i_*bmih.biWidth+j_].rgbtRed; // R bufRGB[1] = rgb[i_*bmih.biWidth+j_].rgbtGreen; // G bufRGB[2] = rgb[i_*bmih.biWidth+j_].rgbtBlue; // B // RGB转换为YUV RGB2YUV(bufRGB,bufYUV); yuv_y0 = bufYUV[0]; // y yuv_u0 = bufYUV[1]; // u yuv_v0 = bufYUV[2]; // v for (int k=0; k<1000; k++) ; //延时 // 视图中显示 pDC->SetPixel(j_, (bmih.biHeight-1)-i_, RGB(bufRGB[0], bufRGB[1], bufRGB[2])); // UYVY标准 [U0 Y0 V0 Y1] [U1 Y2 V1 Y3] [U2 Y4 V2 Y5] 每像素点两个字节,[内]为四个字节 if ((j_%2)==0) { *Video_Field1 = yuv_u0; Video_Field1++; yuv_v1 = yuv_v0; // v保存起来供下一字节使用 } else { *Video_Field1 = yuv_v1; Video_Field1++; } *Video_Field1 = yuv_y0; Video_Field1++; } } } // 关闭BMP位图文件 f->Close(); WriteYUV(Video_Field0_, Video_Field1_, size); // 释放内存 free( Video_Field0_ ); free( Video_Field1_ ); delete f; delete rgb; }
void bayerGBRG_to_yuv422planar_bilinear(const unsigned char *bayer, unsigned char *yuv, unsigned int width, unsigned int height) { unsigned char *y = yuv; unsigned char *u = YUV422_PLANAR_U_PLANE(yuv, width, height); unsigned char *v = YUV422_PLANAR_V_PLANE(yuv, width, height); const unsigned char *bf = bayer; int y1, u1, v1, y2, u2, v2; int r, g, b; // first line is special // g b ... line // not full data in first columns RGB2YUV(bf[width], *bf, bf[1], y1, u1, v1); ++bf; r = (bf[width - 1] + bf[width + 1]) >> 1; // correct: // g = (bf[-1] + bf[width] + bf[1]) / 3; // faster: g = (bf[-1] + bf[1]) >> 1; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); // rest of first line for (unsigned int w = 2; w < width - 2; w += 2) { b = (bf[-1] + bf[1]) >> 1; RGB2YUV(bf[width], *bf, b, y1, u1, v1); ++bf; r = (bf[width - 1] + bf[width + 1]) >> 1; // correct: // g = (bf[-1] + bf[width] + bf[1]) / 3; // faster: g = (bf[-1] + bf[1]) >> 1; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // not full data in last columns b = (bf[-1] + bf[1]) >> 1; RGB2YUV(bf[width], *bf, b, y1, u1, v1); ++bf; g = (bf[-1] + bf[width]) >> 1; RGB2YUV(bf[width - 1], g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); for ( unsigned int h = 1; h < height - 1; h += 2) { // r g ... line // correct: g = (bf[-width] + bf[1] + bf[width]) / 3; // faster: g = (bf[-width] + bf[1]) >> 1; b = (bf[width-1] + bf[width+1]) >> 1; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; r = (bf[-1] + bf[1]) >> 1; b = (bf[-width] + bf[width]) >> 1; RGB2YUV(r, *bf, b, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); for (unsigned int w = 2; w < width - 2; w += 2) { g = (bf[-width] + bf[1] + bf[width] + bf[-1]) >> 2; b = (bf[-width-1] + bf[-width+1] + bf[width-1] + bf[width+1]) >> 2; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; r = (bf[-1] + bf[1]) >> 1; b = (bf[-width] + bf[width]) >> 1; RGB2YUV(r, *bf, b, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } g = (bf[-width] + bf[1] + bf[width] + bf[-1]) >> 2; b = (bf[-width-1] + bf[-width+1] + bf[width-1] + bf[width+1]) >> 2; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; b = (bf[-width] + bf[width]) >> 1; RGB2YUV(bf[-1], *bf, g, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); // g b ... line r = (bf[width] + bf[-width]) >> 1; RGB2YUV(r, *bf, bf[1], y1, u1, v1); ++bf; r = (bf[-width-1] + bf[-width+1] + bf[width - 1] + bf[width + 1]) >> 2; g = (bf[-width] + bf[1] + bf[width] + bf[-1]) >> 2; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); for (unsigned int w = 2; w < width - 2; w += 2) { r = (bf[width] + bf[-width]) >> 1; b = (bf[-1] + bf[1]) >> 1; RGB2YUV(r, *bf, b, y1, u1, v1); ++bf; r = (bf[-width-1] + bf[-width+1] + bf[width-1] + bf[width+1]) >> 2; g = (bf[-width] + bf[1] + bf[width] + bf[-1]) >> 2; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } r = (bf[width] + bf[-width]) >> 1; b = (bf[-1] + bf[1]) >> 1; RGB2YUV(r, *bf, b, y1, u1, v1); ++bf; r = (bf[-width-1] + bf[width-1]) >> 1; // correct: g = (bf[-width] + bf[width] + bf[-1]) / 3; // faster: g = (bf[-width] + bf[-1]) >> 1; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // last r g ... line // correct: g = (bf[-width] + bf[1] + bf[width]) / 3; // faster: g = (bf[-width] + bf[1]) >> 1; b = bf[-width+1]; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; r = (bf[-1] + bf[1]) >> 1; b = bf[-width]; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); for (unsigned int w = 2; w < width - 2; w += 2) { // correct: g = (bf[-width] + bf[1] + bf[-1]) / 3 // faster: g = (bf[-width] + bf[-1]) >> 1; b = (bf[-width-1] + bf[-width+1]) >> 1; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; r = (bf[-1] + bf[1]) >> 1; b = bf[-width]; RGB2YUV(r, *bf, b, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // correct: g = (bf[-width] + bf[1] + bf[-1]) / 3; // faster: g = (bf[-width] + bf[-1]) >> 1; b = (bf[-width-1] + bf[-width+1]) >> 1; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; b = bf[-width]; RGB2YUV(bf[-1], *bf, b, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); }
void bayerGBRG_to_yuv422planar_bilinear2(const unsigned char *bayer, unsigned char *yuv, unsigned int width, unsigned int height) { unsigned char *y = yuv; unsigned char *u = YUV422_PLANAR_U_PLANE(yuv, width, height); unsigned char *v = YUV422_PLANAR_V_PLANE(yuv, width, height); const unsigned char *bf = bayer; int y1, u1, v1, y2, u2, v2; int r, g, b; // ignore first g b ... line bf += width; y += width; u += width >> 1; v += width >> 1; for ( unsigned int h = 1; h < height - 1; h += 2) { // r g ... line // ignore first two columns ++bf; ++bf; ++y; ++y; ++u; ++v; for (unsigned int w = 2; w < width - 2; w += 2) { g = (bf[1] + bf[-1]) >> 1; b = (bf[width-1] + bf[width+1]) >> 1; RGB2YUV(*bf, g, b, y1, u1, v1); ++bf; r = (bf[-1] + bf[1]) >> 1; b = (bf[-width] + bf[width]) >> 1; RGB2YUV(r, *bf, b, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // ignore last two columns ++bf; ++bf; ++y; ++y; ++u; ++v; // g b ... line // ignore first two columns ++bf; ++bf; ++y; ++y; ++u; ++v; for (unsigned int w = 2; w < width - 2; w += 2) { r = (bf[width] + bf[-width]) >> 1; b = (bf[-1] + bf[1]) >> 1; RGB2YUV(r, *bf, b, y1, u1, v1); ++bf; r = (bf[width-1] + bf[width+1]) >> 1; g = (bf[1] + bf[width]) >> 1; RGB2YUV(r, g, *bf, y2, u2, v2); ++bf; assign(y, u, v, y1, u1, v1, y2, u2, v2); } // ignore last two columns ++bf; ++bf; ++y; ++y; ++u; ++v; } // ignore last r g ... line }
void SDLDisplayPattern(chain_t *display_service) { displaythread_info_t *info=(displaythread_info_t*)display_service->data; unsigned char *pimage; int sx = display_service->current_buffer->frame.size[0]; int sy = display_service->current_buffer->frame.size[1]; int y,u,v,is,ie,js,je; unsigned char block[4]; register int i; register int j; is = (7*sx)/16; is = is-is%2; ie = (9*sx)/16; ie = ie-ie%2; js = (7*sy)/16; je = (9*sy)/16; RGB2YUV(display_service->camera->prefs.overlay_color_r, display_service->camera->prefs.overlay_color_g, display_service->camera->prefs.overlay_color_b,y,u,v); switch(display_service->camera->prefs.overlay_type) { case OVERLAY_TYPE_REPLACE: switch(preferences.overlay_byte_order) { case DC1394_BYTE_ORDER_YUYV: block[0]=y; block[1]=u; block[2]=y; block[3]=v; break; case DC1394_BYTE_ORDER_UYVY: block[0]=u; block[1]=y; block[2]=v; block[3]=y; break; default: fprintf(stderr,"Invalid overlay byte order coding: %d\n",preferences.overlay_byte_order); break; } break; case OVERLAY_TYPE_RANDOM: switch(preferences.overlay_byte_order) { case DC1394_BYTE_ORDER_YUYV: block[0]=random()/(RAND_MAX/255); block[1]=random()/(RAND_MAX/255); block[2]=block[0]; block[3]=random()/(RAND_MAX/255); break; case DC1394_BYTE_ORDER_UYVY: block[0]=random()/(RAND_MAX/255); block[1]=random()/(RAND_MAX/255); block[2]=random()/(RAND_MAX/255); block[3]=block[1]; break; } break; case OVERLAY_TYPE_INVERT: memset(block, 0, sizeof(block)); break; default: fprintf(stderr,"Invalid display overlay type: %d\n",display_service->camera->prefs.overlay_type); memset(block, 0, sizeof(block)); break; } pthread_mutex_lock(&watchthread_info.mutex_area); pimage=info->sdloverlay->pixels[0]; switch(display_service->camera->prefs.overlay_pattern) { case OVERLAY_PATTERN_OFF: break; case OVERLAY_PATTERN_RECTANGLE: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { j=js; for (i=is;i<=ie;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j-1)*sx+i)<<1)); } j=je; for (i=is;i<=ie;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j+1)*sx+i)<<1)); } i=is; for (j=js;j<=je;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } i=ie; for (j=js;j<=je;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } } else { j=js; for (i=is;i<=ie;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j-1)*sx+i)<<1)); } j=je; for (i=is;i<=ie;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j+1)*sx+i)<<1)); } i=is; for (j=js;j<=je;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } i=ie; for (j=js;j<=je;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } break; case OVERLAY_PATTERN_SMALL_CROSS: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { j=sy/2; for (i=is;i<=ie;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j-1)*sx+i)<<1)); } i=sx/2; i=i-i%2; for (j=js;j<=je;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } } else { j=sy/2; for (i=is;i<=ie;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j-1)*sx+i)<<1)); } i=sx/2; i=i-i%2; for (j=js;j<=je;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } break; case OVERLAY_PATTERN_LARGE_CROSS: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { j=sy/2; for (i=0;i<sx;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j-1)*sx+i)<<1)); } i=sx/2; i=i-i%2; for (j=0;j<sy;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } } else { j=sy/2; for (i=0;i<sx;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j-1)*sx+i)<<1)); } i=sx/2; i=i-i%2; for (j=0;j<sy;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } break; case OVERLAY_PATTERN_GOLDEN_MEAN: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { j=sy/3; for (i=0;i<sx;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j-1)*sx+i)<<1)); } j=(2*sy)/3; for (i=0;i<sx;i+=2) { INVPIX(pimage, ((j*sx+i)<<1)); INVPIX(pimage, (((j-1)*sx+i)<<1)); } i=sx/3; i=i-i%2; for (j=0;j<sy;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } i=(2*sx)/3; i=i-i%2; for (j=0;j<sy;j++) { INVPIX(pimage, ((j*sx+i)<<1)); } } else { j=sy/3; for (i=0;i<sx;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j-1)*sx+i)<<1)); } j=(2*sy)/3; for (i=0;i<sx;i+=2) { REPLPIX(pimage, block, ((j*sx+i)<<1)); REPLPIX(pimage, block, (((j-1)*sx+i)<<1)); } i=sx/3; i=i-i%2; for (j=0;j<sy;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } i=(2*sx)/3; i=i-i%2; for (j=0;j<sy;j++) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } break; case OVERLAY_PATTERN_IMAGE: break; case OVERLAY_PATTERN_OVER_UNDEREXPOSED: switch(preferences.overlay_byte_order) { case DC1394_BYTE_ORDER_YUYV: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { for (i=0;i<sx;i+=2) { for (j=0;j<sy;j++) { if ((pimage[(j*sx+i)<<1]>254)||(pimage[(j*sx+i)<<1]<1)|| (pimage[(j*sx+i+1)<<1]>254)||(pimage[(j*sx+i+1)<<1]<1)) { INVPIX(pimage, ((j*sx+i)<<1)); } } } } else { for (i=0;i<sx;i+=2) { for (j=0;j<sy;j++) { if ((pimage[(j*sx+i)<<1]>254)||(pimage[(j*sx+i)<<1]<1)|| (pimage[(j*sx+i+1)<<1]>254)||(pimage[(j*sx+i+1)<<1]<1)) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } } } break; case DC1394_BYTE_ORDER_UYVY: if (display_service->camera->prefs.overlay_type==OVERLAY_TYPE_INVERT) { for (i=0;i<sx;i+=2) { for (j=0;j<sy;j++) { if ((pimage[((j*sx+i)<<1)+1]>254)||(pimage[((j*sx+i)<<1)+1]<1)|| (pimage[((j*sx+i+1)<<1)+1]>254)||(pimage[((j*sx+i+1)<<1)+1]<1)) { INVPIX(pimage, ((j*sx+i)<<1)); } } } } else { for (i=0;i<sx;i+=2) { for (j=0;j<sy;j++) { if ((pimage[((j*sx+i)<<1)+1]>254)||(pimage[((j*sx+i)<<1)+1]<1)|| (pimage[((j*sx+i+1)<<1)+1]>254)||(pimage[((j*sx+i+1)<<1)+1]<1)) { REPLPIX(pimage, block, ((j*sx+i)<<1)); } } } } break; default: fprintf(stderr,"Invalid overlay byte order\n"); } break; default: fprintf(stderr,"Wrong overlay pattern ID\n"); break; } pthread_mutex_unlock(&watchthread_info.mutex_area); }
int main(int argc,char** argv){ quality=atof(argv[1]); BMP fin2 (argv[2]); BMP fin ;fin.init(fin2.w,fin2.h); BMP fout2;fout2.init(fin2.w,fin2.h); BMP fout;fout.init(fin2.w,fin2.h); double in[8][8]; double out[8][8]; double out2[8][8]; int i,j,idx; init_walsh(); init_dwt(); bmp_for(fin) RGB2YUV(fin2(x,y),fin(x,y)); int num_dat[14]; double prob_dat[14]; int sum_dat[14]; double bit_dat[14]; memset(num_dat,0,sizeof(num_dat)); int num_totallen=0; for(int c=0;c<3;c++){ for(int by=0;by<fin.h/8;by++) for(int bx=0;bx<fin.w/8;bx++){ int num_codelen=0; for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; in[ dy][ dx]=fin(x,y)[c]; // in[ dy][ dx]=255; } //dct(in,out); //walsh(in,out); // mprint(in); //dwt(in,out); haar(in,out); // mprint(out); // idwt(out,in); // mprint(in); // return 0; // ihaar(out,in); // mprint(in); // return 0; // if(c!=0) mmap(out,(1.0/(qt[c][y][x]*quality))*); mmap(out,round); // mprint(out); vector<RunBit> rvec; vector<Code> cvec; mkRunBit(out,rvec); mkCode(rvec,cvec); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ num_dat[(int)(log(fabs(out[dy][dx])+1.0)/log(2))]++; } // for(int i=0;i<rvec.size();i++) // printf("%d %d\n",rvec[i].zero,rvec[i].code); // printf("\n"); // for(int i=0;i<cvec.size();i++) // printf("%d %x\n",cvec[i].len,cvec[i].code); // return 0; for(int i=0;i<cvec.size();i++) num_codelen+=cvec[i].len; double comprate=(double)(8*8*8)/(double)(num_codelen); // if(comprate<3){ // mprint(out); // for(int i=0;i<rvec.size();i++) // printf("%d %d\n",rvec[i].zero,rvec[i].code); // printf("\n"); // for(int i=0;i<cvec.size();i++) // printf("%d %x\n",cvec[i].len,cvec[i].code); // printf("\n"); // printf("comprate %f",comprate); // return 0; // } num_totallen+=num_codelen; // if(c!=0) mmap(out,(qt[c][y][x]*quality)*); //idct(out,out2); //walsh(out,out2); //idwt(out,out2); ihaar(out,out2); for(int dy=0;dy<8;dy++) for(int dx=0;dx<8;dx++){ int x=bx*8+dx; int y=by*8+dy; fout(x,y)[c]=lmt3[c](out2[ dy][ dx]); } } } bmp_for(fin) YUV2RGB(fout(x,y),fout2(x,y)); for(int y=0;y<14;y++) prob_dat[y]=(double)(num_dat[y])/(double)(fin.w*fin.h*3); for(int y=0;y<14;y++) sum_dat[y]=1<<y; for(int y=0;y<14;y++) if(sum_dat[y]!=0&&prob_dat[y]!=0.0) bit_dat[y]=-log(prob_dat[y]/sum_dat[y])/log(2); double ave_bits=0; for(int y=0;y<14;y++) ave_bits+=prob_dat[y]*bit_dat[y]; for(int y=0;y<14;y++){ printf("%2d,%5d,%9d,%8.3f,%8.3f,%8.3f\n", y, sum_dat[y], num_dat[y], prob_dat[y], bit_dat[y], prob_dat[y]*bit_dat[y] ); } printf("ideal comprate:%f\n",8.0/ave_bits); double tcomprate=(double)(fin.w*fin.h*24)/(double)(num_totallen); printf("tcomprate %f\n",tcomprate); fout2.write(argv[3]); return true; }
void Libvlc_Video_Display_Callback(void *opaque, void *picture) { CVlcRtspSDK *pDlg = (CVlcRtspSDK *)opaque; if (pDlg == NULL) return ; if(pDlg->Width ==0) return ; if( ! pDlg->CapturePath.IsEmpty()) { ZOGDramBMP(pDlg->CapturePath.GetBuffer(0),(unsigned char *)picture,pDlg->Width,pDlg->Height); pDlg->CapturePath=""; } memcpy(pDlg->m_DC_Cache.GetCacheBuffer(), picture, pDlg->Width*pDlg->Height*pDlg->m_nBitCount/8); CRect rect; ::GetWindowRect(pDlg->hWnd,&rect); pDlg->pDc->StretchBlt(0, 0,rect.Width(), rect.Height(), pDlg->m_DC_Cache.GetCacheDC(), 0, 0,pDlg->Width,pDlg->Height ,SRCCOPY); //车牌识别 #if OPEN_LC_CARDETECT_CODE //启用识别 if(DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].enableCarDetect) { DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]++; if(0==DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]%CAR_JUMP_NUM) { DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]=0; //拷贝数值 DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].m_playhandle=pDlg->screenNo; DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].camid= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].camID; strcpy(DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].cam_name, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].name.GetBuffer(0)); if(DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].ip.GetLength() >0) { strcpy(DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].l_ipaddr, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].ip.GetBuffer(0)); } else strcpy(DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].l_ipaddr,"0.0.0.0"); DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].cam_Direction= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].Direction; //颜色LC_VIDEO_FORMAT_YV12 与颜色LC_VIDEO_FORMAT_I420 相反 DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].Start(LC_VIDEO_FORMAT_BGR24, (unsigned char *)picture,pDlg->Width,pDlg->Height,pDlg->Width*pDlg->Height*3); DlgMain->DlgTabVideo.DlgScreen.CarDetect[pDlg->screenNo].Result(); } } #endif //车牌识别 #if OPEN_HYZJ_CARDETECT_CODE //启用识别 if(DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].enableCarDetect) { DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]++; if(0==DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]%CAR_JUMP_NUM) { DlgMain->DlgTabVideo.DlgScreen.CarAdd[pDlg->screenNo]=0; //拷贝数值 DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].m_playhandle=pDlg->screenNo; DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].camid= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].camID; strcpy(DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].cam_name, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].name.GetBuffer(0)); if(DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].ip.GetLength() >0) { strcpy(DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].l_ipaddr, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].ip.GetBuffer(0)); } else strcpy(DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].l_ipaddr,"0.0.0.0"); DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].cam_Direction= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].Direction; //颜色LC_VIDEO_FORMAT_YV12 与颜色LC_VIDEO_FORMAT_I420 相反 //ImageFormatBGR #if 0 unsigned long yuvlen=pDlg->Width*pDlg->Height*3; RGB2YUV((unsigned char *)picture,pDlg->Width,pDlg->Height,pDlg->YUVdata,&yuvlen) ; DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].Start(ImageFormatYUV420, pDlg->YUVdata,pDlg->Width,pDlg->Height,yuvlen); #else DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].Start(ImageFormatBGR, (unsigned char *)picture,pDlg->Width,pDlg->Height,pDlg->Width*pDlg->Height*3); #endif DlgMain->DlgTabVideo.DlgScreen.HYZJCarDetect[pDlg->screenNo].Result(); } } #endif #if OPEN_FACEDETECT_CODE //启用识别 if(DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].enableFaceDetect) { DlgMain->DlgTabVideo.DlgScreen.FaceAdd[pDlg->screenNo]++; if(0==DlgMain->DlgTabVideo.DlgScreen.FaceAdd[pDlg->screenNo]%FACE_JUMP_NUM) { DlgMain->DlgTabVideo.DlgScreen.FaceAdd[pDlg->screenNo]=0; // YUV2RGB((unsigned char *)pBuf, DlgMain->DlgTabVideo.DlgScreen.RGBdata[screenNo], nWidth,nHeight); //拷贝数值 DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].m_playhandle=pDlg->screenNo; DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].camid= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].camID; strcpy(DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].cam_name, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].name.GetBuffer(0)); strcpy(DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].l_ipaddr, DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].ip.GetBuffer(0)); DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].cam_Direction= DlgMain->DlgTabVideo.DlgScreen.m_videoInfo[pDlg->screenNo].Direction; DlgMain->DlgTabVideo.DlgScreen.FaceDetect[pDlg->screenNo].Start(VIDEO_FORMAT_RGB888, (unsigned char *)picture,pDlg->Width,pDlg->Height,pDlg->Width*3,pDlg->Width*pDlg->Height*3); //ZOGDramBMP("d:\\112212121.bmp",DlgMain->DlgTabVideo.DlgScreen.RGBdata[screenNo], nWidth,nHeight); } } #endif #if (TEST_DEBUG && DEAD_WHILE) libvlc_time_t end=libvlc_media_player_get_length( pDlg->m_pLibvlc_Mp); libvlc_time_t cur= libvlc_media_player_get_time( pDlg->m_pLibvlc_Mp); if(( end-cur)<=100) { libvlc_media_player_set_time(pDlg->m_pLibvlc_Mp,0); } #endif }