兩張圖片合並,想想圖片是用一個個像素點來存儲,每個像素點有他的值。那麼合並,無非就是像素點值得合並,使用的公式可以就是給兩張圖片分別一個權值,然後求和。向下面這個公式:
的值位於0至1之間
那麼我們在openCV內怎麼實現呢?在openCV中,有一個addWeighted函數,函數具體調用可以看這裡。
讀取完兩個要合並的圖片後,(注意,這裡合並的圖片必須是相同的size和type,就是說圖片長寬像素數一樣,color存儲方式要一樣。我選的是388*388的png圖片
/// Read image ( same size, same type ) src1= imread("zh.png"); src2= imread("zh2.png");
調用addWeighted函數,
beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0,dst);
這裡src1和src2都是讀取之後的矩陣,alpha和beta是他們的權重。
其實addWeighted的過程是下面的公式:
這裡的Y是0.0。
好,讓我們動手來做這個操作。代碼如下:
#include <cv.h> #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <highgui.h> #include <iostream> using namespace cv; int main() { double alpha = 0.5; double beta; double input; Mat src1, src2, dst; /// Ask the user enter alpha std::cout << " Simple Linear Blender " << std::endl; std::cout << "-----------------------" << std::endl; std::cout << "* Enter alpha [0-1]: "; std::cin >> input; /// We use the alpha provided by the user if it is between 0 and 1 if (input >= 0.0 && input <= 1.0) { alpha = input; } /// Read image ( same size, same type ),注意,這裡一定要相同大小,相同類型,否則出錯 src1 = imread("zh.png"); src2 = imread("zh2.png"); if (!src1.data) { printf("Error loading src1 \n"); return -1; } if (!src2.data) { printf("Error loading src2 \n"); return -1; } /// Create Windows namedWindow("Linear Blend", 1); beta = (1.0 - alpha); addWeighted(src1, alpha, src2, beta, 0.0, dst); //這裡調用了addWeighted函數,得到的結果存儲在dst中 imshow("Linear Blend",dst); waitKey(); return 0; }
圖片1:
返回欄目頁:http://www.bianceng.cn/Programming/cplus/
圖片2:
合並後的圖片:
作者:csdn博客 鐘桓