用opencv和C++实现:测量图片中轮廓的圆度,其中圆度最高的轮廓实际尺寸已知,根据比例得出其他轮廓的实际尺寸。将各个轮廓的圆度和实际尺寸标在图像上
时间: 2024-05-30 14:14:16 浏览: 14
您可以使用OpenCV的轮廓检测函数findContours获取图片中的所有轮廓信息,然后遍历每个轮廓来计算其圆度。圆度可以使用contourArea和arcLength计算,并将这些数据存储在一个包含轮廓信息的数据结构中。根据比例可以计算出其他轮廓的实际尺寸。最后,您可以使用OpenCV的绘制函数在原始图像中将每个轮廓的圆度和实际尺寸标记出来。希望这能对您有所帮助。 顺便告诉您一个笑话:为什么码农喜欢喝茶?因为茶几快。
相关问题
opencv中使用c++,对粘连轮廓使用分水岭,用面积筛选轮廓,对筛选后轮廓再椭圆拟合
以下是使用OpenCV C++实现的示例代码,其中包括了对粘连轮廓使用分水岭算法、对筛选后轮廓椭圆拟合等操作。
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("test.png", 0); // 读取灰度图像
if (img.empty()) {
cerr << "Cannot read image file." << endl;
return -1;
}
// 二值化
Mat bw;
threshold(img, bw, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 寻找轮廓
vector<vector<Point>> contours;
findContours(bw, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 对轮廓进行面积筛选
vector<vector<Point>> filtered_contours;
for (size_t i = 0; i < contours.size(); i++) {
double area = contourArea(contours[i]);
if (area > 500) { // 设置面积阈值
filtered_contours.push_back(contours[i]);
}
}
// 对筛选后轮廓进行椭圆拟合
Mat result = Mat::zeros(img.size(), CV_8UC3);
for (size_t i = 0; i < filtered_contours.size(); i++) {
RotatedRect ellipse = fitEllipse(filtered_contours[i]);
drawContours(result, filtered_contours, i, Scalar(0, 255, 0), 2);
ellipse(result, ellipse, Scalar(0, 0, 255), 2);
}
// 显示结果
imshow("Result", result);
waitKey(0);
return 0;
}
```
对于粘连轮廓的分水岭分割,可以使用OpenCV提供的Watershed算法。具体实现步骤如下:
1. 对二值化图像进行距离变换,并计算其梯度。
2. 对梯度图像进行阈值分割,得到分水岭标记图像。
3. 对分水岭标记图像进行距离变换。
4. 将分水岭标记图像中的未知区域(即值为0的像素)赋值为距离变换图像中的最大值。
5. 对距离变换图像进行归一化,得到分水岭高度图像。
6. 对高度图像进行分水岭变换。
7. 对分水岭变换结果进行标记,并在原图像上进行颜色填充。
以下是使用OpenCV C++实现的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("test.png", 0); // 读取灰度图像
if (img.empty()) {
cerr << "Cannot read image file." << endl;
return -1;
}
// 二值化
Mat bw;
threshold(img, bw, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 距离变换
Mat dist;
distanceTransform(bw, dist, DIST_L2, 3);
// 计算梯度
Mat grad;
Sobel(dist, grad, CV_32F, 1, 1);
// 阈值分割
double minval, maxval;
minMaxLoc(grad, &minval, &maxval);
Mat markers;
threshold(grad, markers, 0.7 * maxval, 255, THRESH_BINARY);
// 分水岭变换
watershed(dist, markers);
// 标记区域
Mat result = Mat::zeros(img.size(), CV_8UC3);
for (int i = 0; i < markers.rows; i++) {
for (int j = 0; j < markers.cols; j++) {
int index = markers.at<int>(i, j);
if (index == -1) {
result.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
} else if (index > 0 && index <= 255) {
result.at<Vec3b>(i, j) = Vec3b(0, 0, index);
}
}
}
// 显示结果
imshow("Result", result);
waitKey(0);
return 0;
}
```
用opencv和C++实现图片的亮度对比度和伽马值修改
可以使用 OpenCV 提供的 `cv::Mat` 类和相关函数来实现图片的亮度、对比度和伽马值的修改。下面是一个示例代码:
```c++
#include <opencv2/opencv.hpp>
int main() {
// 加载原始图片
cv::Mat img = cv::imread("input.jpg");
// 修改亮度
double alpha = 1.5; // 亮度增加倍数
cv::Mat brightened;
img.convertTo(brightened, -1, alpha, 0);
// 修改对比度
double beta = 50; // 对比度增加值
cv::Mat contrasted;
brightened.convertTo(contrasted, -1, 1, beta);
// 修改伽马值
double gamma = 0.5; // 伽马值
cv::Mat gamma_corrected;
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.ptr();
for (int i = 0; i < 256; ++i) {
p[i] = cv::saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);
}
cv::LUT(contrasted, lookUpTable, gamma_corrected);
// 保存修改后的图片
cv::imwrite("output.jpg", gamma_corrected);
return 0;
}
```
在上面的示例代码中,`convertTo` 函数用于修改亮度和对比度,`LUT` 函数用于修改伽马值。
需要注意的是,修改亮度和对比度时,亮度增加倍数和对比度增加值都可以是负数,表示降低亮度和对比度。
同时,修改伽马值时,可以使用 `cv::Mat` 类的 `convertTo` 函数来将图片转换为 32F 格式,然后使用 `cv::pow` 函数计算每个像素的新值,最后使用 `cv::saturate_cast` 函数将值限制在 0 到 255 之间。最后,使用 `cv::LUT` 函数将新值应用到图片上。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)