📄 tps_bfshape.cpp
字号:
}
ppxlcV += FwidthUV;
}
/*
printf("======== width = %d, height = %d\n", width, height);
FILE *fp;
fp = fopen("bbb", "w");
fwrite(destY, sizeof (PixelC), width*height, fp);
fwrite(destU, sizeof (PixelC), width*height/4, fp);
fwrite(destV, sizeof (PixelC), width*height/4, fp);
fclose(fp);
exit(1);
*/
}
Void convertYuv(const CVOPU8YUVBA* pvopcSrc, PixelC* destY, PixelC* destU, PixelC* destV, Int width, Int height)
{
CoordI x, y;
Int Fwidth = pvopcSrc->whereY ().width;
Int FwidthUV = pvopcSrc->whereUV ().width;
Int nSkipYPixel = Fwidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
Int nSkipUVPixel = FwidthUV * EXPANDUV_REF_FRAME + EXPANDUV_REF_FRAME;
PixelC* ppxlcY = (PixelC*)( (Int)(pvopcSrc->pixelsY ()) + nSkipYPixel );
PixelC* ppxlcU = (PixelC*)( (Int)(pvopcSrc->pixelsU ()) + nSkipUVPixel );
PixelC* ppxlcV = (PixelC*)( (Int)(pvopcSrc->pixelsV ()) + nSkipUVPixel );
PixelC* pdY = destY; PixelC* pdU = destU; PixelC* pdV = destV;
PixelC* psY; PixelC* psU; PixelC* psV;
// convert
for (y = 0; y < height; y++) {
psY = ppxlcY;
for (x = 0; x < width; x++) {
*pdY = *psY;
pdY++;
psY++;
}
ppxlcY += Fwidth;
}
for (y = 0; y < height/2; y++) {
psU = ppxlcU;
for (x = 0; x < width/2; x++) {
*pdU = *psU;
pdU++;
psU++;
}
ppxlcU += FwidthUV;
}
for (y = 0; y < height/2; y++) {
psV = ppxlcV;
for (x = 0; x < width/2; x++) {
*pdV = *psV;
pdV++;
psV++;
}
ppxlcV += FwidthUV;
}
}
Void convertSeg(const CVOPU8YUVBA* pvopcSrc, PixelC* destBY, PixelC* destBUV, Int width, Int height,
Int left, Int right, Int top, Int bottom)
{
CoordI x, y;
Int Fwidth = pvopcSrc->whereY ().width;
Int sum, color = 0;
Int nSkipYPixel = Fwidth * EXPANDY_REF_FRAME + EXPANDY_REF_FRAME;
PixelC* ppxlcBY = (PixelC*)( (Int)(pvopcSrc->pixelsBY ()) + nSkipYPixel );
PixelC* pdBY = destBY; PixelC* pdBUV = destBUV;
PixelC* psBY;
// convert
for (y = 0; y < height; y++) {
psBY = ppxlcBY;
for (x = 0; x < width; x++) {
if(left <= x && x < right && top <= y && y < bottom)
*pdBY = *psBY;
else{
*pdBY = *psBY = 0; // set zero for out side of VOP rectangle
}
if(*pdBY>0) color = *pdBY;
pdBY++;
psBY++;
}
ppxlcBY += Fwidth;
}
// if(color == 0){
// printf("!!! No object !!!\n");
// exit(1);
// }
for (y = 0; y < height/2; y++) {
for (x = 0; x < width/2; x++) {
sum = *(destBY + 2*y*width + 2*x) + *(destBY + (2*y+1)*width + 2*x) +
*(destBY + 2*y*width + 2*x+1) + *(destBY + (2*y+1)*width + 2*x+1);
if(sum>0)
*pdBUV = color;
else
*pdBUV = 0;
pdBUV++;
}
}
}
// modified Oct. 1 '97 (by Watanabe and Katata)
/* NBIT: change unsigned char to PixelC
Void pre_pad(unsigned char *mask, unsigned char *curr, int width, int height)
*/
Void pre_pad(PixelC *mask, PixelC *curr, int width, int height)
{
int i, j;
int flag_cnt = 0;
int *flag_blk, *mask_blk;
double *curr_blk;
double pad_val = 0.0;
int ic, jc;
double *hori_blk, *vert_blk;
int *hori_flag_blk, *vert_flag_blk;
flag_blk = (int *)malloc(sizeof(int)*width*height);
mask_blk = (int *)malloc(sizeof(int)*width*height);
curr_blk = (double *)malloc(sizeof(double)*width*height);
// Oct. 1 '97
hori_blk = (double *)malloc(sizeof(double)*width*height);
vert_blk = (double *)malloc(sizeof(double)*width*height);
hori_flag_blk = (int *)malloc(sizeof(int)*width*height);
vert_flag_blk = (int *)malloc(sizeof(int)*width*height);
for(j = 0; j < height; j++)
for(i = 0; i < width; i++) {
mask_blk[j * width + i] = (mask[j * width + i] != 0);
if(mask_blk[j * width + i])
hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i] = (double) curr[j * width + i];
else
hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i] = 0;
}
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
flag_cnt+= (flag_blk[j * width + i] = mask_blk[j * width + i]);
if(flag_cnt == 0) return;
while(flag_cnt != 0) {
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
hori_flag_blk[j * width + i] = vert_flag_blk[j * width + i] = flag_blk[j * width + i];
for(j = 0; j < height; j++)
for(i = 0; i < width; i++){
mask_blk[j * width + i] = flag_blk[j * width + i];
hori_blk[j * width + i] = vert_blk[j * width + i] = curr_blk[j * width + i];
}
for(j = 0; j < height; j++) {/* horizontal scan */
for(ic = 1; ic < width; ic++)
if(mask_blk[j * width + ic-1] - mask_blk[j * width + ic] == 1) break;
for(i = ic; i < width; i++) {
if(mask_blk[j * width + i-1] - mask_blk[j * width + i] == 1)
pad_val = hori_blk[j * width + i-1];
if(!mask_blk[j * width + i]) {
hori_blk[j * width + i]+= pad_val;
hori_flag_blk[j * width + i]++;
}
}
for(ic = width-2; ic >= 0; ic--)
if(mask_blk[j * width + ic+1] - mask_blk[j * width + ic] == 1) break;
for(i = ic; i >= 0; i--) {
if(mask_blk[j * width + i+1] - mask_blk[j * width + i] == 1)
pad_val = hori_blk[j * width + i+1];
if(!mask_blk[j * width + i]) {
hori_blk[j * width + i]+= pad_val;
hori_flag_blk[j * width + i]++;
}
}
}/* end of horizontal scan */
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
if(hori_flag_blk[j * width + i] != 0) {
hori_blk[j * width + i] = (int)(hori_blk[j * width + i]/(double) hori_flag_blk[j * width + i]); // Oct.1 '97
hori_flag_blk[j * width + i]/= hori_flag_blk[j * width + i];
}
for(i = 0; i < width; i++) {/* vertical scan */
for(jc = 1; jc < height; jc++)
if(mask_blk[(jc-1) * width + i] - mask_blk[jc * width + i] == 1) break;
for(j = jc; j < height; j++) {
if(mask_blk[(j-1) * width + i] - mask_blk[j * width + i] == 1)
pad_val = vert_blk[(j-1) * width + i];
if(!mask_blk[j * width + i]) {
vert_blk[j * width + i]+= pad_val;
vert_flag_blk[j * width + i]++;
}
}
for(jc = height-2; jc >= 0; jc--)
if(mask_blk[(jc+1) * width + i] - mask_blk[jc * width + i] == 1) break;
for(j = jc; j >= 0; j--) {
if(mask_blk[(j+1) * width + i] - mask_blk[j * width + i] == 1)
pad_val = vert_blk[(j+1) * width + i];
if(!mask_blk[j * width + i]) {
vert_blk[j * width + i]+= pad_val;
vert_flag_blk[j * width + i]++;
}
}
}/* end of vertical scan */
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
if(vert_flag_blk[j * width + i] != 0) {
vert_blk[j * width + i] = (int)(vert_blk[j * width + i]/(double) vert_flag_blk[j * width + i]); // Oct.1 '97
vert_flag_blk[j * width + i]/= vert_flag_blk[j * width + i];
}
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
if(hori_flag_blk[j * width + i] == 1 && vert_flag_blk[j * width + i] == 1)
curr_blk[j * width + i] = (int)((hori_blk[j * width + i] + vert_blk[j * width + i])/2.0);
else if (hori_flag_blk[j * width + i] == 1)
curr_blk[j * width + i] = hori_blk[j * width + i];
else if (vert_flag_blk[j * width + i] == 1)
curr_blk[j * width + i] = vert_blk[j * width + i];
flag_cnt = width * height;
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
if(hori_flag_blk[j * width + i] == 1 || vert_flag_blk[j * width + i] == 1){
flag_blk[j * width + i] = 1;
flag_cnt--;
}
}/* end of while() */
for(j = 0; j < height; j++)
for(i = 0; i < width; i++)
curr[j * width + i] = (unsigned char) curr_blk[j * width + i];
free(flag_blk);
free(mask_blk);
free(curr_blk);
free(hori_blk);
free(vert_blk);
free(hori_flag_blk);
free(vert_flag_blk);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -