@@ -613,6 +613,7 @@ bool CvCaptureCAM_V4L::autosetup_capture_mode_v4l2()
613613 V4L2_PIX_FMT_NV21,
614614 V4L2_PIX_FMT_SBGGR8,
615615 V4L2_PIX_FMT_SGBRG8,
616+ V4L2_PIX_FMT_SGRBG8,
616617 V4L2_PIX_FMT_XBGR32,
617618 V4L2_PIX_FMT_ABGR32,
618619 V4L2_PIX_FMT_SN9C10X,
@@ -679,6 +680,7 @@ bool CvCaptureCAM_V4L::convertableToRgb() const
679680 case V4L2_PIX_FMT_SBGGR8:
680681 case V4L2_PIX_FMT_SN9C10X:
681682 case V4L2_PIX_FMT_SGBRG8:
683+ case V4L2_PIX_FMT_SGRBG8:
682684 case V4L2_PIX_FMT_RGB24:
683685 case V4L2_PIX_FMT_Y16:
684686 case V4L2_PIX_FMT_Y16_BE:
@@ -1487,6 +1489,94 @@ static void sgbrg2rgb24(long int WIDTH, long int HEIGHT, unsigned char *src, uns
14871489 }
14881490}
14891491
1492+ // SGRBG to RGB24
1493+ static void sgrbg2rgb24 (long int WIDTH, long int HEIGHT, unsigned char *src, unsigned char *dst)
1494+ {
1495+ long int i;
1496+ unsigned char *rawpt, *scanpt;
1497+ long int size;
1498+
1499+ rawpt = src;
1500+ scanpt = dst;
1501+ size = WIDTH*HEIGHT;
1502+
1503+ for ( i = 0 ; i < size; i++ )
1504+ {
1505+ if ( (i/WIDTH) % 2 == 0 ) // even row
1506+ {
1507+ if ( (i % 2 ) == 0 ) // even pixel
1508+ {
1509+ if ( (i > WIDTH) && ((i % WIDTH) > 0 ) )
1510+ {
1511+ *scanpt++ = (*(rawpt-WIDTH) + *(rawpt+WIDTH))/2 ; /* R */
1512+ *scanpt++ = *(rawpt); /* G */
1513+ *scanpt++ = (*(rawpt-1 )+*(rawpt+1 ))/2 ; /* B */
1514+ } else
1515+ {
1516+ /* first line or left column */
1517+
1518+ *scanpt++ = *(rawpt+WIDTH); /* R */
1519+ *scanpt++ = *(rawpt); /* G */
1520+ *scanpt++ = *(rawpt+1 ); /* B */
1521+ }
1522+ } else // odd pixel
1523+ {
1524+ if ( (i > WIDTH) && ((i % WIDTH) < (WIDTH-1 )) )
1525+ {
1526+ *scanpt++ = (*(rawpt-WIDTH-1 ) + *(rawpt-WIDTH+1 ) +
1527+ *(rawpt+WIDTH-1 ) + *(rawpt+WIDTH+1 )) / 4 ; /* R */
1528+ *scanpt++ = (*(rawpt-1 ) + *(rawpt+1 ) +
1529+ *(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4 ; /* G */
1530+ *scanpt++ = *(rawpt); /* B */
1531+ } else
1532+ {
1533+ /* first line or right column */
1534+
1535+ *scanpt++ = *(rawpt+WIDTH-1 ); /* R */
1536+ *scanpt++ = (*(rawpt-1 )+*(rawpt+WIDTH))/2 ; /* G */
1537+ *scanpt++ = *(rawpt); /* B */
1538+ }
1539+ }
1540+ } else
1541+ { // odd row
1542+ if ( (i % 2 ) == 0 ) // even pixel
1543+ {
1544+ if ( (i < (WIDTH*(HEIGHT-1 ))) && ((i % WIDTH) > 0 ) )
1545+ {
1546+ *scanpt++ = *(rawpt); /* R */
1547+ *scanpt++ = (*(rawpt-1 ) + *(rawpt+1 )+
1548+ *(rawpt-WIDTH) + *(rawpt+WIDTH)) / 4 ; /* G */
1549+ *scanpt++ = (*(rawpt-WIDTH-1 ) + *(rawpt-WIDTH+1 ) +
1550+ *(rawpt+WIDTH-1 ) + *(rawpt+WIDTH+1 )) / 4 ; /* B */
1551+ } else
1552+ {
1553+ /* bottom line or left column */
1554+
1555+ *scanpt++ = *(rawpt); /* R */
1556+ *scanpt++ = (*(rawpt+1 )+*(rawpt-WIDTH))/2 ; /* G */
1557+ *scanpt++ = *(rawpt-WIDTH+1 ); /* B */
1558+ }
1559+ } else
1560+ { // odd pixel
1561+ if ( i < (WIDTH*(HEIGHT-1 )) && ((i % WIDTH) < (WIDTH-1 )) )
1562+ {
1563+ *scanpt++ = (*(rawpt-1 )+*(rawpt+1 ))/2 ; /* R */
1564+ *scanpt++ = *(rawpt); /* G */
1565+ *scanpt++ = (*(rawpt-WIDTH)+*(rawpt+WIDTH))/2 ; /* B */
1566+ } else
1567+ {
1568+ /* bottom line or right column */
1569+
1570+ *scanpt++ = (*(rawpt-1 )); /* R */
1571+ *scanpt++ = *(rawpt); /* G */
1572+ *scanpt++ = (*(rawpt-WIDTH)); /* B */
1573+ }
1574+ }
1575+ }
1576+ rawpt++;
1577+ }
1578+ }
1579+
14901580#define CLAMP (x ) ((x)<0 ?0 :((x)>255 )?255 :(x))
14911581
14921582typedef struct {
@@ -1706,6 +1796,10 @@ void CvCaptureCAM_V4L::convertToRgb(const Buffer ¤tBuffer)
17061796 sgbrg2rgb24 (imageSize.width , imageSize.height ,
17071797 start, (unsigned char *)frame.imageData );
17081798 return ;
1799+ case V4L2_PIX_FMT_SGRBG8:
1800+ sgrbg2rgb24 (imageSize.width , imageSize.height ,
1801+ start, (unsigned char *)frame.imageData );
1802+ return ;
17091803 default :
17101804 break ;
17111805 }
0 commit comments