一.簡介
相當於在PS中,新建一個畫布
cv::Mat 類和 lplimage / cvMat結構體都可以表示一張圖像
二.構造函數創建圖像
// 創建一個空矩陣 cv::Mat image1; // 創建一個6行6列的8位1通道的矩陣 cv::Mat image2(6, 6, CV_8UC1); // 創建一個7行7列的8位3通道的矩陣 cv::Mat image3(cv::Size(7, 7), CV_8UC3); cv::Mat image4(8, 8, CV_32FC2, cv::Scalar(1, 3)); cv::Mat image4(10, 8, CV_8UC1, cv::Scalar(5)); cv::Mat image5(cv::Size(9, 9), CV_8UC3, cv::Scalar(1, 2, 3)); cv::Mat image6(image2);
三.create()創建圖像
Mat m(2,2,CV_8UC3); m.create(3,2,CV_8UC2);
五.單窗口顯示多張圖像
cv::resize() //圖像縮放
cv::showManyImages() //顯示多張圖像
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
void showManyImages(const std::vector<cv::Mat>& srcImages, cv::Size imgSize)
{
int nNumImages = srcImages.size();
cv::Size nSizeWindows;
if(nNumImages > 12)
{
std::cout << "Not more than 12 images!" << std::endl;
return ;
}
// 根據圖片序列數量來確定分割小窗口形態
switch(nNumImages)
{
case 1: nSizeWindows = cv::Size(1,1);break;
case 2: nSizeWindows = cv::Size(2,1);break;
case 3:
case 4: nSizeWindows = cv::Size(2,2);break;
case 5:
case 6: nSizeWindows = cv::Size(3,2);break;
case 7:
case 8: nSizeWindows = cv::Size(4,2);break;
case 9: nSizeWindows = cv::Size(3,3);break;
default: nSizeWindows = cv::Size(4,3);break;
}
// 設置小圖像尺寸 間隙 邊界
int nShowImageSize = 200;
int nSplitLineSize = 15;
int nAroundLineSize = 50;
// 創建輸出圖像 圖像大小根據輸入源確定
const int imagesHeight = nShowImageSize * nSizeWindows.width + nAroundLineSize + (nSizeWindows.width - 1) * nSplitLineSize;
const int imagesWidth = nShowImageSize * nSizeWindows.height + nAroundLineSize + (nSizeWindows.height - 1) * nSplitLineSize;
std::cout << imagesWidth << " " << imagesHeight <<std::endl;
cv::Mat showWindowImages(imagesWidth, imagesHeight, CV_8UC3, cv::Scalar(0, 0, 0));
//提取對應小圖像的左上角坐標X Y
int posX = (showWindowImages.cols - (nShowImageSize * nSizeWindows.width + (nSizeWindows.width - 1) * nSplitLineSize))/2;
int posY = (showWindowImages.rows - (nShowImageSize * nSizeWindows.height + (nSizeWindows.height - 1) * nSplitLineSize)) / 2;
std::cout << posX << " " << posY << std::endl;
int tempPosX = posX;
int tempPosY = posY;
// 將每一小幅圖像整合成大圖像
for (int i = 0; i < nNumImages; i++)
{
// 小圖像坐標轉換
if((i % nSizeWindows.width == 0) && (tempPosX != posX))
{
tempPosX = posX;
tempPosY += (nSplitLineSize + nShowImageSize);
}
// 利用Rect區域將小圖像置於大圖像相應區域
cv::Mat tempImage = showWindowImages(cv::Rect(tempPosX, tempPosY, nShowImageSize, nShowImageSize));
//利用resize函數實現圖像縮放
resize(srcImages[i], tempImage, cv::Size(nShowImageSize, nShowImageSize));
tempPosX += (nSplitLineSize + nShowImageSize);
}
cv::imshow("showWindowImages", showWindowImages);
}
int main()
{
// 圖像源輸入
std::vector<cv::Mat> srcImages(9);
srcImages[0] = cv::imread("a.jpg");
srcImages[1] = cv::imread("a.jpg");
srcImages[2] = cv::imread("a.jpg");
srcImages[3] = cv::imread("a.jpg");
srcImages[4] = cv::imread("a.jpg");
srcImages[5] = cv::imread("a.jpg");
srcImages[6] = cv::imread("a.jpg");
srcImages[7] = cv::imread("a.jpg");
srcImages[8] = cv::imread("a.jpg");
// 判斷當前vector讀入的正確性
for (int i = 0; i < srcImages.size(); i++)
{
if (!srcImages[i].data)
{
std::cout << "read error!" << std::endl;
return -1;
}
}
//調用單窗口顯示圖像
showManyImages(srcImages, cv::Size(512, 400));
cv::waitKey(0);
return 0;
}
