OpenCV2:幼儿园篇 第一章 创建图像并显示
一.简介
相当于在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()创建图像
1 2 | Mat m(2,2,CV_8UC3); m.create(3,2,CV_8UC2); |
五.单窗口显示多张图像
cv::resize() //图像缩放
cv::showManyImages() //显示多张图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #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; } |
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版