1. 程式人生 > >0004-用OpenCV實現影象平移的程式碼(分影象尺寸不變和變兩種情況)

0004-用OpenCV實現影象平移的程式碼(分影象尺寸不變和變兩種情況)

影象平移是啥東西就不用講了吧!需要注意的是影象平移有兩種,第一種是平移後圖像大小不變,這樣會損失影象的部分;第二種是平移後圖像大小變化,這樣原影象不會有損失。

直接上程式碼,大家看效果吧!

程式碼流程如下
讀取影象→顯示原影象→呼叫自定義的函式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是顯示的是平移時影象尺寸變化的平移結果,可以看見,輸出影象變大了,原圖是沒有損失的。