opencv c++ 中uniform函数用法
时间: 2023-05-25 10:02:29 浏览: 356
在OpenCV C++中,uniform函数用于生成随机分布的数组。它的语法如下:
```cpp
void cv::randu(InputOutputArray dst, InputArray lowerb, InputArray upperb)
```
其中,参数意义如下:
- `dst`:输出的数组。
- `lowerb`:下限值。
- `upperb`:上限值。
`randu`函数会生成一个位于`[lowerb, upperb]`之间的随机分布的数组,并将结果存储在输出数组`dst`中。
例如,下面的代码演示了如何使用uniform函数生成一个5行5列、元素值位于[0,1]之间的浮点型矩阵:
```cpp
cv::Mat mat(5, 5, CV_32F);
cv::randu(mat, cv::Scalar(0), cv::Scalar(1));
```
相关问题
opencv calchist函数C++实现
以下是使用C++实现OpenCV中的calcHist函数的示例代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("test.jpg", IMREAD_GRAYSCALE); //读入灰度图像
if (image.empty()) //判断图像是否为空
{
cerr << "Failed to load image!" << endl;
return -1;
}
int histSize = 256; //直方图中bin的数量
float range[] = { 0, 256 }; //像素值范围
const float* histRange = { range };
bool uniform = true, accumulate = false;
Mat hist; //用于保存直方图的Mat
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); //计算直方图
int hist_w = 512, hist_h = 400; //直方图的宽和高
int bin_w = cvRound((double)hist_w / histSize); //每个bin的宽度
Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0)); //用于绘制直方图的Mat
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); //将直方图归一化到[0, histImage.rows]范围内
for (int i = 1; i < histSize; i++)
{
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1))),
Point(i * bin_w, hist_h - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); //在直方图上绘制每个bin的高度
}
imshow("Image", image);
imshow("Histogram", histImage);
waitKey(0);
return 0;
}
```
首先,使用`imread`函数读入灰度图像。然后,定义直方图的bin数量、像素值范围、是否均匀化、是否累加等参数,并创建一个用于保存直方图的Mat。接着,调用`calcHist`函数计算直方图。
计算完直方图后,定义用于绘制直方图的Mat,并将直方图归一化到[0, histImage.rows]范围内。最后,在直方图上绘制每个bin的高度,然后显示原始图像和直方图,等待用户按下任意键后程序结束。
opencv c++ meanshift 跟踪算法的实现
1. 背景
Meanshift算法是一种基于概率密度函数的图像跟踪算法,它可以用于物体跟踪、目标跟踪等领域。本文将介绍Meanshift算法的原理和实现方式。
2. 原理
Meanshift算法是基于概率密度函数的图像跟踪算法,其基本原理是根据当前帧中目标的位置和大小,计算出目标模型的概率密度函数,然后将该函数与下一帧中的图像进行卷积,得到目标在下一帧中的位置和大小。
具体实现步骤如下:
1)选择一个初始窗口,在该窗口内计算出目标的概率密度函数。
2)在下一帧中,将原始图像和目标模型的概率密度函数进行卷积,得到新的目标位置和大小。
3)重复上述过程,直到目标跟踪结束。
3. 实现
下面是一个简单的Meanshift跟踪算法的实现代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读入视频
VideoCapture cap("test.mp4");
if (!cap.isOpened())
{
cout << "视频读入失败" << endl;
return -1;
}
// 初始化目标窗口
Rect trackWindow(0, 0, 0, 0);
Mat frame, hsv, mask, hist, backproj;
// 设置迭代终止条件
TermCriteria termCrit(TermCriteria::EPS | TermCriteria::COUNT, 10, 1);
// 开始循环跟踪
while (true)
{
// 读入当前帧
cap >> frame;
if (frame.empty())
break;
// 将当前帧转换为HSV颜色空间
cvtColor(frame, hsv, COLOR_BGR2HSV);
// 计算目标模型的直方图
if (trackWindow.area() <= 0)
{
int x = frame.cols / 2;
int y = frame.rows / 2;
int w = 100;
int h = 100;
trackWindow = Rect(x - w / 2, y - h / 2, w, h);
// 提取ROI
Mat roi(hsv, trackWindow);
Mat maskroi;
inRange(roi, Scalar(0, 60, 32), Scalar(180, 255, 255), maskroi);
Mat hsv_roi(hsv, trackWindow);
calcHist(&hsv_roi, 1, 0, maskroi, hist, 2, &histSize, &histRange, uniform, accumulate);
normalize(hist, hist, 0, 255, NORM_MINMAX);
}
// 计算反向投影
calcBackProject(&hsv, 1, 0, hist, backproj, &histRange);
backproj &= mask;
// 调用meanshift算法
meanShift(backproj, trackWindow, termCrit);
// 在图像中绘制跟踪结果
rectangle(frame, trackWindow, Scalar(0, 0, 255), 2);
// 显示图像
imshow("跟踪结果", frame);
// 按下ESC键退出
if (waitKey(1) == 27)
break;
}
return 0;
}
```
在上述代码中,首先读入视频,并初始化跟踪目标的窗口。然后在循环中,对于每一帧图像,将其转换为HSV颜色空间,并计算目标模型的直方图。接着计算反向投影,并调用meanshift算法进行跟踪。最后在图像中绘制跟踪结果,并进行显示。当按下ESC键时退出程序。
4. 总结
本文介绍了Meanshift跟踪算法的原理和实现方式,以及一个简单的OpenCV C++实现代码。该算法可以用于物体跟踪、目标跟踪等领域,并且具有较高的运行效率。
阅读全文