第三章 学习OpenCV——初探OpenCV
目录
例3-1 使用cvSetImageROI来增加某范围的像素
调用cvSetImageROI()函数来构造RIO,实现对图像指定范围的蓝色通道增加150级操作。笔者将其写成了通过cmd调用和直接调用的两个版本,具体代码如下:
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(int argc, char* argv[])
{
IplImage* src;
/*******************************cmd*********************************/
//if (argc == 7 && ((src = cvLoadImage(argv[1], 1)) != 0)) //判断传递给主函数的参数个数,加载图像至内存
//{
// int x = atoi(argv[2]); //字符串类型转化为整型 char2int
// int y = atoi(argv[3]);
// int width = atoi(argv[4]);
// int height = atoi(argv[5]);
// int add = atoi(argv[6]);
/*******************************Address*********************************/
if (src = cvLoadImage("D:\\Template\\OpenCV\\Template12_SetROI\\Debug\\3.jpg")) //加载图像至内存,返回指向的指针
{
int x = 100;
int y = 100;
int width = 100;
int height = 100;
int add = 150;
cvSetImageROI(src, cvRect(x, y, width, height)); //设置ROI
cvAddS(src, cvScalar(add), src); //数组与标量的元素级相加
cvResetImageROI(src); //释放ROI
cvNamedWindow("Roi_Add", CV_WINDOW_AUTOSIZE); //创建窗口
cvShowImage("Roi_Add", src); //显示图片
cvWaitKey(0);
cvReleaseImage(&src); //释放图像内存
cvDestroyWindow("Roi_Add"); //释放窗口
}
return 0;
}
运行结果如下图:
例3-2 利用widthStep方法把interest_img的所有像素增加1
利用widthStep方法RIO所有像素值增加1,实现cvSetImageROI()函数相同的功能,代码如下:
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(int argc, char* argv[])
{
IplImage* interest_img = cvLoadImage("D:\\Template\\OpenCV\\Template12_SetROI\\Debug\\3.jpg");
CvRect interest_rect = cvRect(100,100,100,100);
IplImage* sub_img = cvCreateImageHeader( //创建一个图像头
cvSize(interest_rect.width, interest_rect.height), //设置图像头的宽度、高度(与ROI相同)
interest_img->depth, //设置图像头的深度(与ROI相同)
interest_img->nChannels); //设置图像头的通道数(与ROI相同)
sub_img->origin = interest_img->origin; //设置图像头原点(与ROI相同)
sub_img->widthStep = interest_img->widthStep; //设置行数据长度(可逐行步进到下一行开头)
sub_img->imageData = interest_img->imageData+ //指向第一行数据的指针+
interest_rect.y*interest_img->widthStep + //行数*行数据长度+
interest_rect.x*interest_img->nChannels; //列数*通道数
cvAddS(sub_img, cvScalar(150), sub_img); //数组与标量的元素级相加
cvNamedWindow("Rio_Add", CV_WINDOW_AUTOSIZE); //创建窗口
cvShowImage("Rio_Add", interest_img); //显示图片
cvWaitKey(0);
cvReleaseImage(&interest_img); //释放图像内存
cvReleaseImage(&sub_img); //释放图像内存
cvDestroyWindow("Rio_Add"); //释放窗口
return 0;
}
运行结果如下图:
widthStep操作可以保持一幅图像的多个子区域处于活动状态,而不必像cvSetImageROI()函数一样反复的设置、重置区域。
例3-3 Alpha(RGBA中的透明度通道)融合
调用cvAddWeighted()函数来实现Alpha融合,实现对两张图像的融合。笔者将其写成了通过cmd调用和直接调用的两个版本,具体代码如下:
#include <cv.h>
#include <highgui.h>
using namespace std;
int main(int argc, char* argv[])
{
IplImage* src1,*src2;
/*******************************cmd*********************************/
//if (a