mirror of
https://github.com/opencv/opencv.git
synced 2025-06-08 01:53:19 +08:00
Merge pull request #25249 from carabsc:cara_changes
Added support for V4L2_PIX_FMT_SGRBG8 pixel format to V4L2 backend
This commit is contained in:
commit
aa5f7727d8
@ -613,6 +613,7 @@ bool CvCaptureCAM_V4L::autosetup_capture_mode_v4l2()
|
|||||||
V4L2_PIX_FMT_NV21,
|
V4L2_PIX_FMT_NV21,
|
||||||
V4L2_PIX_FMT_SBGGR8,
|
V4L2_PIX_FMT_SBGGR8,
|
||||||
V4L2_PIX_FMT_SGBRG8,
|
V4L2_PIX_FMT_SGBRG8,
|
||||||
|
V4L2_PIX_FMT_SGRBG8,
|
||||||
V4L2_PIX_FMT_XBGR32,
|
V4L2_PIX_FMT_XBGR32,
|
||||||
V4L2_PIX_FMT_ABGR32,
|
V4L2_PIX_FMT_ABGR32,
|
||||||
V4L2_PIX_FMT_SN9C10X,
|
V4L2_PIX_FMT_SN9C10X,
|
||||||
@ -679,6 +680,7 @@ bool CvCaptureCAM_V4L::convertableToRgb() const
|
|||||||
case V4L2_PIX_FMT_SBGGR8:
|
case V4L2_PIX_FMT_SBGGR8:
|
||||||
case V4L2_PIX_FMT_SN9C10X:
|
case V4L2_PIX_FMT_SN9C10X:
|
||||||
case V4L2_PIX_FMT_SGBRG8:
|
case V4L2_PIX_FMT_SGBRG8:
|
||||||
|
case V4L2_PIX_FMT_SGRBG8:
|
||||||
case V4L2_PIX_FMT_RGB24:
|
case V4L2_PIX_FMT_RGB24:
|
||||||
case V4L2_PIX_FMT_Y16:
|
case V4L2_PIX_FMT_Y16:
|
||||||
case V4L2_PIX_FMT_Y16_BE:
|
case V4L2_PIX_FMT_Y16_BE:
|
||||||
@ -1487,6 +1489,94 @@ static void sgbrg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, uns
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SGRBG to RGB24
|
||||||
|
static void sgrbg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, unsigned char *dst)
|
||||||
|
{
|
||||||
|
long int i;
|
||||||
|
unsigned char *rawpt, *scanpt;
|
||||||
|
long int size;
|
||||||
|
|
||||||
|
rawpt = src;
|
||||||
|
scanpt = dst;
|
||||||
|
size = WIDTH*HEIGHT;
|
||||||
|
|
||||||
|
for ( i = 0; i < size; i++ )
|
||||||
|
{
|
||||||
|
if ( (i/WIDTH) % 2 == 0 ) //even row
|
||||||
|
{
|
||||||
|
if ( (i % 2) == 0 ) //even pixel
|
||||||
|
{
|
||||||
|
if ( (i > WIDTH) && ((i % WIDTH) > 0) )
|
||||||
|
{
|
||||||
|
*scanpt++ = (*(rawpt-WIDTH) + *(rawpt+WIDTH))/2; /* R */
|
||||||
|
*scanpt++ = *(rawpt); /* G */
|
||||||
|
*scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; /* B */
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/* first line or left column */
|
||||||
|
|
||||||
|
*scanpt++ = *(rawpt+WIDTH); /* R */
|
||||||
|
*scanpt++ = *(rawpt); /* G */
|
||||||
|
*scanpt++ = *(rawpt+1); /* B */
|
||||||
|
}
|
||||||
|
} else //odd pixel
|
||||||
|
{
|
||||||
|
if ( (i > WIDTH) && ((i % WIDTH) < (WIDTH-1)) )
|
||||||
|
{
|
||||||
|
*scanpt++ = (*(rawpt-WIDTH-1) + *(rawpt-WIDTH+1) +
|
||||||
|
*(rawpt+WIDTH-1) + *(rawpt+WIDTH+1)) / 4; /* R */
|
||||||
|
*scanpt++ = (*(rawpt-1) + *(rawpt+1) +
|
||||||
|
*(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4; /* G */
|
||||||
|
*scanpt++ = *(rawpt); /* B */
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/* first line or right column */
|
||||||
|
|
||||||
|
*scanpt++ = *(rawpt+WIDTH-1); /* R */
|
||||||
|
*scanpt++ = (*(rawpt-1)+*(rawpt+WIDTH))/2; /* G */
|
||||||
|
*scanpt++ = *(rawpt); /* B */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{ //odd row
|
||||||
|
if ( (i % 2) == 0 ) //even pixel
|
||||||
|
{
|
||||||
|
if ( (i < (WIDTH*(HEIGHT-1))) && ((i % WIDTH) > 0) )
|
||||||
|
{
|
||||||
|
*scanpt++ = *(rawpt); /* R */
|
||||||
|
*scanpt++ = (*(rawpt-1) + *(rawpt+1)+
|
||||||
|
*(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4; /* G */
|
||||||
|
*scanpt++ = (*(rawpt-WIDTH-1) + *(rawpt-WIDTH+1) +
|
||||||
|
*(rawpt+WIDTH-1) + *(rawpt+WIDTH+1)) / 4; /* B */
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/* bottom line or left column */
|
||||||
|
|
||||||
|
*scanpt++ = *(rawpt); /* R */
|
||||||
|
*scanpt++ = (*(rawpt+1)+*(rawpt-WIDTH))/2; /* G */
|
||||||
|
*scanpt++ = *(rawpt-WIDTH+1); /* B */
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{ //odd pixel
|
||||||
|
if ( i < (WIDTH*(HEIGHT-1)) && ((i % WIDTH) < (WIDTH-1)) )
|
||||||
|
{
|
||||||
|
*scanpt++ = (*(rawpt-1)+*(rawpt+1))/2; /* R */
|
||||||
|
*scanpt++ = *(rawpt); /* G */
|
||||||
|
*scanpt++ = (*(rawpt-WIDTH)+*(rawpt+WIDTH))/2; /* B */
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/* bottom line or right column */
|
||||||
|
|
||||||
|
*scanpt++ = (*(rawpt-1)); /* R */
|
||||||
|
*scanpt++ = *(rawpt); /* G */
|
||||||
|
*scanpt++ = (*(rawpt-WIDTH)); /* B */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rawpt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
|
#define CLAMP(x) ((x)<0?0:((x)>255)?255:(x))
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -1706,6 +1796,10 @@ void CvCaptureCAM_V4L::convertToRgb(const Buffer ¤tBuffer)
|
|||||||
sgbrg2rgb24(imageSize.width, imageSize.height,
|
sgbrg2rgb24(imageSize.width, imageSize.height,
|
||||||
start, (unsigned char*)frame.imageData);
|
start, (unsigned char*)frame.imageData);
|
||||||
return;
|
return;
|
||||||
|
case V4L2_PIX_FMT_SGRBG8:
|
||||||
|
sgrbg2rgb24(imageSize.width, imageSize.height,
|
||||||
|
start, (unsigned char*)frame.imageData);
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user