图像的平移

本文介绍在Visual Studio 2013中利用OpenCV 2.4.9进行图像处理,特别是图像平移的操作。重点讲解了Mat类的at()函数在实现此功能中的应用。
摘要由CSDN通过智能技术生成

开发环境 vs2013+opencv2.4.9.

Mat的成员函数at()是一个模板函数。
代码1是at()函数在opencv里面的源代码

style="font-size:18px;">template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)//代码1
代码2是ptr()函数在opencv里面的源代码
 style="font-size:18px;">inline uchar* Mat::ptr(int y)//代码2
测试代码:

#include 
   
   
    
    
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
//图像大小不变
cv::Mat  imageTranslation1(cv::Mat &srcImage, int xoffset, int yoffset)
{
	//获取图像行列数
	int rows = srcImage.rows;
	int cols = srcImage.cols;
	cv::Mat resultImage(srcImage.size(), srcImage.type());
	//图像的遍历
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			int x = j - xoffset;
			int y = i - yoffset;
			//判断边界大小
			if (x >= 0 && y >= 0 && x < cols&&y < rows)
				resultImage.at
    
    
     
     (i, j) = srcImage.ptr
     
     
      
      (y)[x];
		}
	}
	//返回平移图像
	return resultImage;
}
cv::Mat  imageTranslation2(cv::Mat &srcImage, int xoffset, int yoffset)
{
	int nrows = srcImage.rows + abs(yoffset);
	int ncols = srcImage.cols + abs(xoffset);
	cv::Mat resultImage(nrows, ncols, srcImage.type());
	for (int i = 0; i 
      
      
       
       = 0 && y >= 0 && x < ncols&&y < nrows)
				resultImage.at
       
       
         (i, j) = srcImage.ptr 
        
          (y)[x]; } } return resultImage; } int main() { cv::Mat srcImage = imread("G:\\vc++图像处\\opencv\\28573_源码\\OpenCV图像处理编程实例_源码\\images\\flower4.jpg"); imshow("srcImage", srcImage); //图像左平移不改变图像大小 int xoffset = 50; int yoffset = 80; cv::Mat resultImage1 = imageTranslation1(srcImage, xoffset, yoffset); cv:imshow("resultImage1 ", resultImage1); //图像左平移改变大小 cv::Mat resultImage2 = imageTranslation2(srcImage, xoffset, yoffset); imshow("resultImage2 ", resultImage2); //图像右平移不改变大小 xoffset = -50; yoffset = -80; cv::Mat resultImage3 = imageTranslation1(srcImage, xoffset, yoffset); imshow("resultImage3 ", resultImage3); system("pause"); cv::waitKey(0); return 0; } /* This is a standalone program. Pass an image name as a first parameter of the program. Switch between standard and probabilistic Hough transform by changing "#if 1" to "#if 0" and back */ #include 
         
           #include 
          
            #include 
           
             int main(int argc, char** argv) { const char* filename = argc >= 2 ? argv[1] : "pic1.png"; IplImage* src = cvLoadImage( filename, 0 ); IplImage* dst; IplImage* color_dst; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; if( !src ) return -1; dst = cvCreateImage( cvGetSize(src), 8, 1 ); color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); cvCanny( src, dst, 50, 200, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR ); #if 0 lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); for( i = 0; i < MIN(lines->total,100); i++ ) { float* line = (float*)cvGetSeqElem(lines,i); float rho = line[0]; float theta = line[1]; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); } #else lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); for( i = 0; i < lines->total; i++ ) { CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 ); } #endif cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvNamedWindow( "Hough", 1 ); cvShowImage( "Hough", color_dst ); cvWaitKey(0); return 0; } 
            
           
          
         
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值