Opencv感兴趣区域复制,画点,画线方法总结

本文介绍了使用OpenCV进行图像处理的三个实用技巧:拼接两幅图像、在图像上绘制特征点以及绘制连线。通过具体的代码示例展示了如何实现这些功能。

今天做的东西用到了OpenCV的几个功能,下面对他们依次进行总结。

(1)Opencv对感兴趣区域的复制

具体是这样的,我想把两张图像进行拼接成一幅图像,很容易想象到的方法就是先创建一幅大的图像(高度为两张原图高度的较大者,宽度为两张原图宽度之和),然后把两张图像内容分别复制到这张大图的对应区域即可。
很容易想到用Opencv的ROI方法。
网上很多的总结方法都是用Opencv的C风格的代码,用的是IplImage,但是我用的是C++风格的,代码并不兼容,查了一段时间找到了解决方案,具体代码如下:
  1. void SIFTFeature::imageJoin(cv::Mat &src1, cv::Mat &src2, cv::Mat &dest)  
  2. {  
  3.     cv::Rect roi1 = cv::Rect(0, 0, src1.cols, src1.rows);  
  4.     cv::Mat matchImage1 = dest(roi1);  
  5.     src1.convertTo(matchImage1, matchImage1.type());  
  6.     cv::Rect roi2 = cv::Rect(src1.cols, 0, src2.cols, src2.rows);  
  7.     cv::Mat matchImage2 = dest(roi2);  
  8.     src2.convertTo(matchImage2, matchImage2.type());  
  9. }  
void SIFTFeature::imageJoin(cv::Mat &src1, cv::Mat &src2, cv::Mat &dest)
{
    cv::Rect roi1 = cv::Rect(0, 0, src1.cols, src1.rows);
    cv::Mat matchImage1 = dest(roi1);
    src1.convertTo(matchImage1, matchImage1.type());
    cv::Rect roi2 = cv::Rect(src1.cols, 0, src2.cols, src2.rows);
    cv::Mat matchImage2 = dest(roi2);
    src2.convertTo(matchImage2, matchImage2.type());
}
这是我做的东西的其中一个函数,很显然,src1和src2是原图,dest是拼接好的大图。
首先选择一个感兴趣的矩形区域,然后选中目的图像的该部分区域,使用原图的converTo方法进行转换。
代码很简单,这里只做一个备份,估计下次还会忘。。。
结果如下:
这里的黄线是我做的SIFT特征匹配的结果,与图像拼接无关。

(2)Opencv画点

不多说,直接上代码,其实画的是小圆圈
  1. cv::Point pointInterest;//特征点,用以画在图像中  
  2.                 pointInterest.x = keys[i][k].x;//特征点在图像中横坐标  
  3.                 pointInterest.y = keys[i][k].y;//特征点在图像中纵坐标  
  4.                 cv::circle(image, pointInterest, 2, cv::Scalar(0, 0, 255));//在图像中画出特征点,2是圆的半径  
cv::Point pointInterest;//特征点,用以画在图像中
                pointInterest.x = keys[i][k].x;//特征点在图像中横坐标
                pointInterest.y = keys[i][k].y;//特征点在图像中纵坐标
                cv::circle(image, pointInterest, 2, cv::Scalar(0, 0, 255));//在图像中画出特征点,2是圆的半径

(3)Opencv画线

  1. cv::Point start = cv::Point(x1, y1);  
  2. cv::Point end = cv::Point(x2, y2);  
  3. cv::line(image, start, end, cv::Scalar(0, 255, 255));  
cv::Point start = cv::Point(x1, y1);
cv::Point end = cv::Point(x2, y2);
cv::line(image, start, end, cv::Scalar(0, 255, 255));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值