1. 程式人生 > >在OpenCV環境下寫的兩個影象平移C和C++原始碼!

在OpenCV環境下寫的兩個影象平移C和C++原始碼!

平像平移的概念就不用多說了,直接上經實測無誤的程式碼吧!

原始碼一(C程式設計,不用MAT類)

#include <opencv2/opencv.hpp>  
#include <opencv2/legacy/compat.hpp> 
#include <fstream>
using namespace std;  
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  


//該函式的功能是實現影象的平移
//規定向下、向右為(正,正)
IplImage *moveImage(IplImage *src,int h0,int w0)
{
	int h=h0;
	int w=w0;
	int imageHeight=src->height;
	int imageWidth=src->width;
	int i,j;

	CvScalar sTemp;

	IplImage *dst=cvCloneImage(src);
	cvSetZero(dst);

	if (h>=0 && w>=0)
	{
		//
		for (i=0;i<imageHeight-h;i++)
		{
			for (j=0;j<imageWidth-w;j++)
			{
				sTemp=cvGet2D(src,i,j);
				cvSet2D(dst,i+h,j+w,sTemp);
			}
		}
	}
	else if (h<0 && w>=0)
	{
		for (i=-h;i<imageHeight;i++)
		{
			for (j=0;j<imageWidth-w;j++)
			{
				sTemp=cvGet2D(src,i,j);
				cvSet2D(dst,i+h,j+w,sTemp);
			}
		}
	}
	else if (h>=0 && w<0)
	{
		//
		for (i=0;i<imageHeight-h;i++)
		{
			for (j=-w;j<imageWidth;j++)
			{
				sTemp=cvGet2D(src,i,j);
				cvSet2D(dst,i+h,j+w,sTemp);
			}
		}
	}
	else if (h<0 && w<0)
	{
		for (i=-h;i<imageHeight;i++)
		{
			for (j=-w;j<imageWidth;j++)
			{
				sTemp=cvGet2D(src,i,j);
				cvSet2D(dst,i+h,j+w,sTemp);
			}
		}
	}
	else
	{
		printf("cannot move!");
		dst=cvCloneImage(src);
	}
	return dst;
}


int main(void)
{
	
	IplImage* pImg; //宣告IplImage指標
	IplImage* pImgAfterMove;
	pImg=cvLoadImage("lena.jpg");
	pImgAfterMove=cvCloneImage(pImg);
	cvSetZero(pImgAfterMove);
	pImgAfterMove=moveImage(pImg,100,-100);

	cvNamedWindow("原影象",CV_WINDOW_AUTOSIZE);
	cvShowImage("原影象",pImg );
	cvNamedWindow("平移之後的影象",CV_WINDOW_AUTOSIZE);
	cvShowImage("平移之後的影象",pImgAfterMove);
	cvWaitKey(0); //等待按鍵

	cvDestroyWindow( "原影象" );//銷燬視窗
    cvDestroyWindow( "平移之後的影象" );
	cvReleaseImage( &pImg ); //釋放影象
    cvReleaseImage( &pImgAfterMove );
	return 0;
}

程式執行結果如下圖所示:

影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!