至關於在PS中,新建一個畫布ios
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);
Mat m(2,2,CV_8UC3); m.create(3,2,CV_8UC2);
cv::resize() //圖像縮放ui
cv::showManyImages() //顯示多張圖像spa
#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; }