OpenCV2:第二章 创建图像并显示
一.简介
相当于在PS中,新建一个画布
cv::Mat 类和 lplimage / cvMat结构体都可以表示一张图像
二.构造函数创建图像
// 创建一个空矩阵
cv::Mat image1; // 创建一个6行6列的8位1通道的矩阵
cv::Mat image2(, , CV_8UC1); // 创建一个7行7列的8位3通道的矩阵
cv::Mat image3(cv::Size(, ), CV_8UC3); cv::Mat image4(, , CV_32FC2, cv::Scalar(, ));
cv::Mat image4(, , CV_8UC1, cv::Scalar()); cv::Mat image5(cv::Size(, ), CV_8UC3, cv::Scalar(, , )); 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;
}
OpenCV2:第二章 创建图像并显示的更多相关文章
- [Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第一条
第二章 创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法 ...
- QT 初阶 第二章 创建对话框(查找对话框实例)
最终效果图: 该对话框由三个文件组成:finddialog.h .finddialog.cpp. main.cpp 代码+注释 /*--finddialog.h--*/ #ifndef FINDDIA ...
- 《R语言实战》读书笔记--第二章 创建数据集
2.1数据集的概念 变量的类型是不同的,比如标示符.日期变量.连续变量.名义变量.有序型变量等,记得数据挖掘导论中有专门的描述. R可以处理的数据类型包括了数值型.字符型.逻辑型.复数型(虚数).原生 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第二条
第二条 遇到多个构造器参数时,可以考虑用构建器 当遇到有多个构造器参数时,常见的是用重叠构造器,即: public class TestClass{ public TestClass(int para ...
- [Effective Java读书笔记] 第二章 创建和销毁对象(1~7)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
第六条 消除过期引用 JAVA中依然会有 memory leak的,比如一个栈先增长再收缩,那么从栈中弹出的对象是不会被当做垃圾回收的,即时使用栈的程序不再引用这些对象.这是因为栈的内部维护着对这些对 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第五条
第五条 避免创建不必要的对象 书中一开始举例: String s = new String("stringette"); // don't do this //应该使用下面,只会创 ...
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第三 四条
第三条 用私有构造器或者枚举类型强化singleton属性 singleton指只能被实例化一次的类,即将构造器设置为私有,使用公有静态成员来实例化,且只实例化一次对象 第四条 通过私有构造器强化不可 ...
随机推荐
- ubuntu下安装vmtool
这是我遇到这个问题的解决办法-------无法通过vmware的设置安装vmtoll 1.关闭虚拟机2.编辑虚拟机,将CD/DVD选项改成自动检测(而不是之前指向的ubuntuxxx.iso)3.重启 ...
- FTP两种工作模式:主动模式(Active FTP)和被动模式
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...
- 位运算【C++学习(计蒜客)】
C++提供了位运算操作符,使程序可以直接对内存进行操作.C++的这个特色大大提高了C++程序的执行能力.例如使用位操作运算可以将一个存储单位中的各个二进制位左移或右移一位,也可以将一个存储单位中所有的 ...
- spring AOP excution表达式各符号意思
execution(*com.sample.service.impl..*.*(..)) 符号 含义 execution() 表达式的主题 第一个“*”符号 表示返回值的类型任意: com.sampl ...
- the little schemer 笔记(10)
第十章 What Is the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...
- codeforces 615 D. Multipliers (数论 + 小费马定理 + 素数)
题目链接: codeforces 615 D. Multipliers 题目描述: 给出n个素数,这n个素数的乘积等于s,问p的所有因子相乘等于多少? 解题思路: 需要求出每一个素数的贡献值,设定在这 ...
- One hundred layer HDU - 4374
One hundred layer HDU - 4374 $sum[i][j][k]$表示第i层第j到k列的和 $ans[i][j]$表示第i层最终停留在第j列的最大值,那么显然$ans[i][j]= ...
- javascript简单的表单验证
<html> <head> <title>用户登录</title> <script language="javascript" ...
- ES相关概念理解
Elasticsearch特点:分布式,高性能,高可用,高伸缩的搜索和分析: 1)可作为一个大型分布式集群,处理PB级别的数据,服务大型公司,亦可运行在少数或单台设备上服务小型公司 分布式的特性: E ...
- CZ-python01-06
练习代码 练习代码 # Python注释 # 注释不是越多越好,对于一目了然的代码,不需要添加注释 # 对于复杂的操作,应该在操作开始填上若干行注释 # 对于不是一目了然的代码,应在其行尾添加注释(为 ...