0004-用OpenCV實現影象平移的程式碼(分影象尺寸不變和變兩種情況)
阿新 • • 發佈:2018-11-14
影象平移是啥東西就不用講了吧!需要注意的是影象平移有兩種,第一種是平移後圖像大小不變,這樣會損失影象的部分;第二種是平移後圖像大小變化,這樣原影象不會有損失。
直接上程式碼,大家看效果吧!
程式碼流程如下:
讀取影象→顯示原影象→呼叫自定義的函式translateTransform,作平移後圖像大小不變的平移處理並顯示處理結果→呼叫自定義的函式translateTransformSize,作平移後圖像大小變化的平移處理並顯示處理結果。
程式碼如下:
影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
程式碼中所需圖片下載連結:http://pan.baidu.com/s/1hsBtoMg 密碼:32ps
//opencv版本:OpenCV3.0 //VS版本:VS2013 //Author:qxsf321.net #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include <iostream> using namespace cv; //平移後大小不變 void translateTransform(cv::Mat const& src, cv::Mat& dst, int dx, int dy) { CV_Assert(src.depth() == CV_8U); const int rows = src.rows; const int cols = src.cols; dst.create(rows, cols, src.type()); Vec3b *p; for (int i = 0; i < rows; i++) { p = dst.ptr<Vec3b>(i); for (int j = 0; j < cols; j++) { //平移後坐標對映到原影象 int x = j - dx; int y = i - dy; //保證對映後的座標在原影象範圍內 if (x >= 0 && y >= 0 && x < cols && y < rows) p[j] = src.ptr<Vec3b>(y)[x]; } } } //平移後大小變化 void translateTransformSize(cv::Mat const& src, cv::Mat& dst, int dx, int dy) { CV_Assert(src.depth() == CV_8U); const int rows = src.rows + abs(dy); //輸出影象的大小 const int cols = src.cols + abs(dx); dst.create(rows, cols, src.type()); Vec3b *p; for (int i = 0; i < rows; i++) { p = dst.ptr<Vec3b>(i); for (int j = 0; j < cols; j++) { int x = j - dx; int y = i - dy; if (x >= 0 && y >= 0 && x < src.cols && y < src.rows) p[j] = src.ptr<Vec3b>(y)[x]; } } } int main(int argc, char** argv[]) { Mat srcimage, dst, dst1; srcimage = imread("25.jpg"); namedWindow("src_window"); imshow("src_window", srcimage); translateTransform(srcimage, dst, 50, 50); namedWindow("dst_window"); imshow("dst_window", dst); translateTransformSize(srcimage, dst1, 50, 50); namedWindow("dst_window1"); imshow("dst_window1", dst1); waitKey(0); }
執行結果如下圖所示
執行結果截圖中,dst_window顯示的是平移時影象尺寸不變的平移結果,可以看見,損失了部分原圖;而dst_window1是顯示的是平移時影象尺寸變化的平移結果,可以看見,輸出影象變大了,原圖是沒有損失的。