opencv 繪制半透明圖形 (


opencv 繪制半透明圖形

 
 

初學OpenCV,想繪制半透明矩形,卻發現沒有GDI+那么簡單,在網上搜尋了一番任未得其解,偶然翻到一個對兩張圖片進行像素值加權疊加的函數cvAddWeighted,於是參照例程加以改造寫了一個繪制半透明矩形的封裝方法:

void DrawTransRec(IplImage* img,int x,int y,int width,int height,CvScalar color,double alpha)
{
      IplImage * rec=cvCreateImage(cvSize(width,height),img->depth,img->nChannels);
      cvRectangle(rec,cvPoint(0,0),cvPoint(width,height),color,-1);
      cvSetImageROI(img,cvRect(x,y,width,height));
      cvAddWeighted(img,alpha,rec,1-alpha,0.0,img);
      cvResetImageROI(img);
}
然而受ROI只能設置為矩形的限制,如果我想繪制其他形狀比如圓形改怎么辦呢,其實只要3行代碼就可以搞定了:復制原圖,在新圖上繪制,與原圖加權疊加。代碼如下:

#include "stdafx.h"
#include <cxcore.h>
#include <highgui.h>
 
void DrawTransRec(IplImage* img,int x,int y,int width,int height,CvScalar color,double alpha)
{
      IplImage * rec=cvCreateImage(cvSize(width,height),img->depth,img->nChannels);
      cvRectangle(rec,cvPoint(0,0),cvPoint(width,height),color,-1);
      cvSetImageROI(img,cvRect(x,y,width,height));
      cvAddWeighted(img,alpha,rec,1-alpha,0.0,img);
      cvResetImageROI(img);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
      IplImage * pImage=cvLoadImage("1.jpg");
      if(!pImage)
      {
            fprintf(stderr,"Can not open image file\n");
            return -1;
      }
 
      DrawTransRec(pImage,150,150,150,150,CV_RGB(255,0,0),0.5);
 
      IplImage * pTemp=(IplImage*)cvClone(pImage);
      cvCircle(pTemp,cvPoint(200,200),100,CV_RGB(255,0,0),-1);
      cvAddWeighted(pImage,0.4,pTemp,0.6,0.0,pImage);
      cvReleaseImage(&pTemp);
 
      cvNamedWindow("OpenCVTest",1);
      cvShowImage("OpenCVTest",pImage);
 
      cvWaitKey();
      cvDestroyWindow("OpenCVTest");
      cvReleaseImage(&pImage);
      return 0;
}
當然這樣也會帶來不必要的開銷,即不加以區別的對所有像素點都進行了加權計算,應該可以通過設置ROI來改善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM