复制图像,类似Bitblt函数的复制。

来源:互联网 发布:java未安装成功 编辑:程序博客网 时间:2024/05/22 11:48

实现将图像复制到另外一个图像的指定位置上去。类似于Bitblt函数。

用OpenCV函数,则需要下面这样做:

#include "cv.h"#include "highgui.h"int main(int argc, char** argv){IplImage* pImg = cvLoadImage("D:\\cvImg\\lin.jpg");IplImage* pMax = cvCreateImage(cvSize(pImg->width * 3, pImg->height), pImg->depth, pImg->nChannels);cvSetImageROI(pImg, cvRect(50, 50, 200, 300));cvSetImageROI(pMax, cvRect(20, 10, 200, 300));cvAddWeighted(pImg, 1, pMax, 0, 0, pMax);cvResetImageROI(pMax);cvShowImage("show", pMax);cvWaitKey();return 0;}

但是还是熟悉MS的Bitblt方法,为了方便嘛。然后就做了下面这么个函数。

#include "cv.h"#include "highgui.h"//将图像从pSrc copy到pDest中去。图像必须具备相同个数的通道。bool CopyImg(IplImage* pDest, int dstX, int dstY, int dstW, int dstH, IplImage* pSrc, int srcX = 0, int srcY = 0){//必须具备相同的通道assert(pDest->nChannels == pSrc->nChannels);//剔除不允许的条件if(dstW == 0 || dstH == 0 || pDest == NULL || pSrc == NULL || dstX >= pDest->width || dstY >= pDest->height || srcX >= pSrc->width || srcY >= pSrc->height)return false;//限定区域,如果参数超出了范围,则限制在有效范围以内。dstW = dstW + dstX > pDest->width ? pDest->width - dstX : dstW;dstH = dstH + dstY > pDest->height ? pDest->height - dstY : dstH;dstW = dstW + srcX >= pSrc->width ? pSrc->width - srcX : dstW;dstH = dstH + srcY >= pSrc->height ? pSrc->height - srcY : dstH;dstX = dstX < 0 ? 0 : dstX;dstY = dstY < 0 ? 0 : dstY;srcX = srcX < 0 ? 0 : srcX;srcY = srcY < 0 ? 0 : srcY;//正式开始Copyed数据了。int nChannels = pDest->nChannels;int nCopyedDataLength = 0;for (int y = 0; y < dstH; ++y){char* pDstImg = pDest->imageData + dstX * nChannels + (dstY + y) * pDest->widthStep;char* pSrcImg = pSrc->imageData + srcX * nChannels + (srcY + y) * pSrc->widthStep;nCopyedDataLength = dstW * nChannels;_asm{MOV ECX,nCopyedDataLengthMOV ESI,pSrcImgMOV EDI,pDstImgREP MOVSB}}return true;}int main(int argc, char** argv){IplImage* pImg = cvLoadImage("D:\\cvImg\\lin.jpg");IplImage* pMax = cvCreateImage(cvSize(pImg->width * 3, pImg->height), pImg->depth, pImg->nChannels);CopyImg(pMax, 20, 10, 200, 300, pImg, 50, 50);cvShowImage("show", pMax);cvWaitKey();return 0;}

用瑾瑾懂的那么点汇编知识做了个小小的优化,效率还是可以接受的(复制一张图像1000次750ms),是直接用pDstImg[0] = pSrcImg[0]...的效率的13.688倍(10266ms)。

原创粉丝点击