第三章 学习OpenCV——初探OpenCV

第三章 学习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;
}

运行结果如下图:
设置RIO操作指定范围

例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实现相同功能
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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值