ROI的两种实现

程序:

混合两个图像的一部分

关键函数:

cvSetImageROI

cvResetImageROI

cvAddWeighted

效果:

程序:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
void MixPicture(IplImage* src1,IplImage* src2,int Src1x,int Src1y,int Src2x,int Src2y,int width,int height,double alpha)
{
CvRect ROIRect1=cvRect(Src1x,Src1y,width,height);
CvRect ROIRect2=cvRect(Src2x,Src2y,width,height);
cvSetImageROI(src1,ROIRect1);  //设置图像1的感兴趣区域
cvSetImageROI(src2,ROIRect2);
cvAddWeighted(src1,alpha,src2,1-alpha,0,src1);  //按照权重混合两个图像(只操作感兴趣区域)
cvResetImageROI(src1);   //释放图像1的感兴趣区域,要不显示的时候只会显示感兴趣区域
cvResetImageROI(src2);
}
void MixPicture_widthstep(IplImage* src1,IplImage* src2,int Src1x,int Src1y,int Src2x,int Src2y,int width,int height,double alpha)
{
for(int rows=0;rows<height;rows++)
{
uchar* Src1Ptr=(uchar*)(src1->imageData+(Src1y+rows)*src1->widthStep); //注意是widthStep而不是width,因为可能有冗余字节
uchar* Src2Ptr=(uchar*)(src2->imageData+(Src2y+rows)*src2->widthStep);
for(int cols=0;cols<width;cols++)
{
*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels)=(*(uchar*)(Src2Ptr+(Src2x+cols)*src2->nChannels))*(1-alpha)+(*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels))*alpha;
*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels+1)=(*(uchar*)(Src2Ptr+(Src2x+cols)*src2->nChannels+1))*(1-alpha)+(*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels+1))*alpha;
*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels+2)=(*(uchar*)(Src2Ptr+(Src2x+cols)*src2->nChannels+2))*(1-alpha)+(*(uchar*)(Src1Ptr+(Src1x+cols)*src1->nChannels+2))*alpha;
}
}
}
int ROI(int argc,char** argv)
{
IplImage* src1=cvLoadImage("e:\\picture\\3.jpg");
cvNamedWindow("src1");
cvShowImage("src1",src1);
IplImage* src2=cvLoadImage("e:\\picture\\11.jpg");
cvNamedWindow("src2");
cvShowImage("src2",src1);
//MixPicture(src1,src2,300,300,300,300,200,200,0.4);
MixPicture_widthstep(src1,src2,300,300,300,300,200,200,0.4);
cvNamedWindow("dst");
cvShowImage("dst",src1);
cvWaitKey(0);
cvDestroyWindow("src1");
cvDestroyWindow("src2");
cvDestroyWindow("dst");
cvReleaseImage(&src1);
cvReleaseImage(&src2);
return 0;
}

ROI的两种实现

时间: 2025-01-04 19:50:03

ROI的两种实现的相关文章

 好的运营,应该有两种思维方式

从事产品经理工作,我们有产品思维,那从事 网络运营工作,我们有运营思维吗? 长久以来,我们喜欢谈产品思维,运营思维没有那么口耳相传的火爆.我始终认为,好的思维方式是可被总结与概括,并且易于学习的. 今天简单讨论下运营思维,它只是我的一个想法,希望有启发. 我尝试把运营思维归纳到 两个抽象的模型 中,没错,是两个模型. 一种是用户导向型,一种是运营导向型. 从字面意思理解,用户导向型是以用户的视角.角色来推动运营,而运营导向型更多以企业角度,业务发展的状况衡量.是不是有些神神叨叨?为了更好地说明,

FlyCapture2 fc2Image OpenCV IplImage Conversion 两种图像格式之间的转换

fc2Image是FlyCapture SDK的C语言库中的图片格式,由于在Windows上的MinGW无法编译FlyCapture2的C++库,只能使用C语言库,所以当我们在同时使用OpenCV的图像格式IplImage时,有时候就需要两种格式相互转换.如果需要FlyCapture2 Image和OpenCV IplImage之间的转换,可以参见我之前的博客OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化.我们先来分别看看两种图像格

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

两种插入排序算法java实现

两种方法都编译运行通过,可以当做排序类直接使用. 折半插入排序: public class Sort1 { public static void main(String[] args) { InsertSort sort = new InsertSort(); sort.InsertSort(); int[] arr = sort.getarr(); System.out.println(); System.out.println("排序之后:"); for (int ar : arr

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

Jmeter 跨线程组传递参数 之两种方法

终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直到登录接口的参数失效了,需再次发送一次登录接口,又可以多次使用其参数,下面举例子: 1.登录接口中利用 Json Path Extractor 获取到登录接口的响应参数,(怎么获取上一节讲过) 终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为

第十九篇:处理僵尸进程的两种经典方法

前言 如果父进程没有结束,而子进程终止了.那么在父进程调用 wait 函数回收这个子进程或者父进程终止以前,这个子进程将一直是僵尸进程. 本文将提供两种方法处理这个问题. 方法一:父进程回收法 wait函数将使其调用者阻塞,直到其某个子进程终止.故父进程可调用wait函数回收其僵尸子进程.除此之外,waitpid函数提供更为详尽的功能( 增加了非阻塞功能以及指定等待功能 ),请读者自行查阅相关资料. 代码实现 1 #include <unistd.h> 2 #include <sys/w

maven的两种可运行jar打包方式。1、内置依赖,2、外部依赖。

maven打可运行jar包的两种方式 maven常用的普通打包方式分为pom,jar,war等,至于这些打包类型就不介绍啦. 如果不进行特殊配置,那么打包出来的jar包是不可运行的.只能当作普通依赖包使用. 下面就介绍两种maven打可运行jar包的方式: 方式一:内置打包法 <plugins> <!-- 内置打包法 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <!-- 

em创建的两种方式

em创建(两种方式1,图形dbca,当然了,前提是先创建一个监听. 2,手工命令安装em)手工命令创建em(确保数据库开启,确保监听正常并且最好是动态监听,确保system表空间够用大概1G左右),我的空间有限只给了800M,如下 select file_name,tablespace_name,bytes/1024/1024 from dba_data_files where tablespace_name like 'SYSTEM';alter database datafile '/u01