简单的opencv问题,如何把一个vector中的值传递给mat?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的opencv问题,如何把一个vector中的值传递给mat?相关的知识,希望对你有一定的参考价值。
简单的opencv问题,如何把一个vector中的值传递给mat?刚刚开始学习opencv,麻烦大家了!
Mat A, C; //仅创建了头部
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); //在此我们知道使用的方法(分配矩阵)
Mat B(A); //使用拷贝构造函数
C = A; //赋值运算符
由最后一个使用它的对象清理。这里使用引用计数的机制,每当有人复制Mat对象的头,计数器增加。每当一个头被清除,计数器下调。当计数器变为零,矩阵也就被释放了。因为有时会仍然也要复制矩阵的本身,存在着 clone() 或 copyTo() 函数。
参考技术Aopencv的手册中,指出Mat类存在一个从vector的转换构造函数。用法示例:
vector<double> vec_a;... // 对vec_a赋值
Mat mat_a(vec_a);
就这么简单。
追问谢谢您回答,我刚刚又试了一下,可以了,您说的opencv手册是指的什么?刚刚开始学习,很多不懂的地方。
追答opencv的build目录下有一个docs文件夹,里面的refman.pdf里记载了所有的Opencv类和函数的用法。
本回答被提问者采纳裁剪和旋转图片 OpenCV
【中文标题】裁剪和旋转图片 OpenCV【英文标题】:Crop and rotate picture OpenCV 【发布时间】:2012-11-29 16:02:30 【问题描述】:我是 OpenCV 的新手,所以请宽容。 我正在做一个 Android 应用程序来识别正方形/矩形并裁剪它们。查找正方形/矩形的函数将找到的对象放入矢量>正方形。我只是想知道如何根据存储在vector> squares中的点中的数据裁剪图片,以及如何计算图片应该旋转的角度。感谢您的帮助
【问题讨论】:
【参考方案1】:这篇文章引用自OpenCV QA: Extract a RotatedRect area。
Felix Abecassis 有一篇很棒的文章,介绍了旋转和校正图像。这也向您展示了如何提取 RotatedRect 中的数据:
http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/您基本上只需要cv::getRotationMatrix2D 即可获得仿射变换的旋转矩阵,使用cv::warpAffine 和cv::getRectSubPix 裁剪旋转后的图像。我的应用程序中的相关行是:
// This is the RotatedRect, I got it from a contour for example...
RotatedRect rect = ...;
// matrices we'll use
Mat M, rotated, cropped;
// get angle and size from the bounding box
float angle = rect.angle;
Size rect_size = rect.size;
// thanks to http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/
if (rect.angle < -45.)
angle += 90.0;
swap(rect_size.width, rect_size.height);
// get the rotation matrix
M = getRotationMatrix2D(rect.center, angle, 1.0);
// perform the affine transformation on your image in src,
// the result is the rotated image in rotated. I am doing
// cubic interpolation here
warpAffine(src, rotated, M, src.size(), INTER_CUBIC);
// crop the resulting image, which is then given in cropped
getRectSubPix(rotated, rect_size, rect.center, cropped);
【讨论】:
虽然答案几乎是有效的,但这会在裁剪之前旋转您的整个图像。 高度那里的操作成本很高。【参考方案2】:周围有很多有用的帖子,我相信你可以做一个更好的搜索。
作物:
cropping IplImage most effectively旋转:
OpenCV: how to rotate IplImage? Rotating or Resizing an Image in OpenCV计算角度:
OpenCV - Bounding Box & Skew Angle【讨论】:
***.com/questions/14756505/… 我在 iphone 直播视频流中遇到裁剪问题.. 请你看看我的帖子..【参考方案3】:虽然这个问题已经很老了,但我认为需要一个不像旋转整个图像那样昂贵的答案(请参阅@bytefish 的答案)。你需要一个边界矩形,出于某种原因rotatedRect.boundingRect()
对我不起作用,所以我不得不使用Imgproc.boundingRect(contour)
。这是Android的OpenCV,其他环境的操作几乎一样:
Rect roi = Imgproc.boundingRect(contour);
// we only work with a submat, not the whole image:
Mat mat = image.submat(roi);
RotatedRect rotatedRect = Imgproc.minAreaRect(new MatOfPoint2f(contour.toArray()));
Mat rot = Imgproc.getRotationMatrix2D(rotatedRect.center, rotatedRect.angle, 1.0);
// rotate using the center of the roi
double[] rot_0_2 = rot.get(0, 2);
for (int i = 0; i < rot_0_2.length; i++)
rot_0_2[i] += rotatedRect.size.width / 2 - rotatedRect.center.x;
rot.put(0, 2, rot_0_2);
double[] rot_1_2 = rot.get(1, 2);
for (int i = 0; i < rot_1_2.length; i++)
rot_1_2[i] += rotatedRect.size.height / 2 - rotatedRect.center.y;
rot.put(1, 2, rot_1_2);
// final rotated and cropped image:
Mat rotated = new Mat();
Imgproc.warpAffine(mat, rotated, rot, rotatedRect.size);
【讨论】:
以上是关于简单的opencv问题,如何把一个vector中的值传递给mat?的主要内容,如果未能解决你的问题,请参考以下文章
c ++如何将视频序列放入OpenCV中的vector<Mat>?
如何使用适用于 iOS 的 openCV 检测视频中的正方形?
将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)
opencv里面 怎么把多个Mat合成为一个Mat?例如有100个1行128列的矩阵,怎么合成一个100行128列的矩阵?求