roboforum.ruТехнический форум по робототехнике. |
|
|
Виктор Казаринов писал(а):Тут я немного налетел на грабли OpenCV. Нужно грузить обычные картинки с прозрачностью, накладывать их друг на друга и выводить в обычный Image на форме. Это для создания 2D аватара. Артикуляция, мимика, жесты. И как только в этот OpenCV не гружу картинки, они не хотят быть прозрачными. М.б. кто-то путнее что посоветует?
// 24-bit colour
struct CvBGR { uchar b,g,r; };
CV_IMPL void cvMixImage(const void* apSrcImg, const void* apDstImg, const void* apMixMask)
{
CV_FUNCNAME( "cvMixImage" );
__BEGIN__;
CvMat StubSrcImg, *SrcImg; SrcImg = (CvMat*)apSrcImg;
CV_CALL( SrcImg = cvGetMat( SrcImg, &StubSrcImg ));
if( CV_MAT_TYPE( SrcImg->type ) != CV_8UC3)
CV_ERROR( CV_StsUnsupportedFormat, "Source image must have 8uC3 type" );
CvMat StubDstImg, *DstImg; DstImg = (CvMat*)apDstImg;
CV_CALL( DstImg = cvGetMat( DstImg, &StubDstImg ));
if( CV_MAT_TYPE( DstImg->type ) != CV_8UC3)
CV_ERROR( CV_StsUnsupportedFormat, "Destination image must have 8uC3 type" );
CvMat StubMixMaskImg, *MixMask; MixMask = (CvMat*)apMixMask;
CV_CALL( MixMask = cvGetMat( MixMask, &StubMixMaskImg ));
if( CV_MAT_TYPE( MixMask->type ) != CV_8UC1)
CV_ERROR( CV_StsUnsupportedFormat, "Mix mask image must have 8uC1 type" );
int x,y,hX,hY;
hX = SrcImg->cols;
hY = SrcImg->rows;
CvBGR *psSrc, *psDst, *pSrc, *pDst;
uchar *psMask, *pMask;
psSrc = (CvBGR*)SrcImg->data.ptr;
psDst = (CvBGR*)DstImg->data.ptr;
psMask = MixMask->data.ptr;
for(y=0; y<hY; y++) {
pSrc = psSrc;
pDst = psDst;
pMask = psMask;
for(x=0; x<hX; x++, pSrc++, pDst++, pMask++) {
int Mask = *pMask;
pDst->r = ((int(pDst->r)*(255-Mask))>>8) + ((int(pSrc->r)*Mask)>>8);
pDst->g = ((int(pDst->g)*(255-Mask))>>8) + ((int(pSrc->g)*Mask)>>8);
pDst->b = ((int(pDst->b)*(255-Mask))>>8) + ((int(pSrc->b)*Mask)>>8);
}
psSrc += hX;
psDst += hX;
psMask += hX;
}
__END__;
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10