复制图像,类似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)。
- 复制图像,类似Bitblt函数的复制。
- 使用BitBlt复制位图,出现显示黑色块的问题
- 图像复制
- 复制图像
- MFC 复制某个区域到剪切板 bitblt
- 字符串复制函数 strcyp 复制的原型
- 请写一个函数,实现类似的strcpy的字符串复制功能
- BitBlt函数的用法
- bitblt函数的注意事项
- 复制函数
- cv::Mat 图像拷贝、复制的问题
- opencv中图像复制的坑
- Mat图像的深浅复制区别
- delphi 复制文件夹的函数
- 复制构造函数的疑惑
- 复制构造函数的调用
- 复制HICON的小函数
- 复制构造函数的总结
- 软件测试关注二 :静默安装
- 扩展UIButton的属性
- Java线程
- 面试题25:二叉树中和为某一值的路径
- xendesktop 向现有桌面组中的单独桌面分配用户时报错
- 复制图像,类似Bitblt函数的复制。
- 二维码的编码和解码
- 在浏览器中执行Kettle job或者transformation
- 彩票的两种分析方法
- C语言变长数组之剖析
- android httpget httppost 请求,超时参数的设置
- Fiddler教程
- pku 1952 BUY LOW, BUY LOWER(DP)
- 【全方面检测保护路由器安全】