c++ - 如何使用 OpenCV 拉直曲线?
问题描述
我有这样的曲线图像:
我找不到使用 OpenCV 拉直曲线的技术。它类似于这篇文章Straightening a curve contour,但我的问题是针对使用 opencv 进行编码的(在 C++ 中更好)。
到目前为止,我只能找到曲线的轮廓。
int main()
{
Mat src; Mat src_gray;
src = imread("D:/2.jpg");
cvtColor(src, src_gray, COLOR_BGR2GRAY);
cv::blur(src_gray, src_gray, Size(1, 15));
Canny(src_gray, src_gray, 100, 200, 3);
/// Find contours
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
RNG rng(12345);
findContours(src_gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Draw contours
Mat drawing = Mat::zeros(src_gray.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++)
{
drawContours(drawing, contours, i, (255), 1, 8, hierarchy, 0, Point());
}
imshow("Result window", drawing);
imwrite("D:/C_Backup_Folder/Ivan_codes/VideoStitcher/result/2_res.jpg", drawing);
cv::waitKey();
return 0;
}
但我不知道如何确定哪条线是弯曲的而不是弯曲的,以及如何拉直它。可能吗?任何帮助,将不胜感激。
解决方案
这是我的建议:
在一切之前,将您的图像调整为更大的图像(例如大 5 倍)。然后做你之前做的,得到轮廓。找到每个轮廓的最右侧像素,然后测量该轮廓的所有像素并计算每个像素到最右侧像素的水平距离,并对该行(整行)进行移位。此方法对某些行进行右移,对其他行进行左移。
如果您有多个轮廓,请为每一行中的每个轮廓计算此移位值并计算它们的“平均值”,然后根据每一行的平均值进行移位。
最后调整你的图像大小。这是我能想到的最简单和最快的事情。
推荐阅读
- c++11 - 如何正确使用具有 condition_variable 的原子类型以避免在轻松的原子读取期间锁定
- node.js - 添加文件时监视文件夹并将文件名写入某个文件
- tensorflow - 当我使用 tensorflow_gpu 时,Dlib 不使用 GPU
- r - 有效地找到数据表的第一个非零元素(对应列)
- python - 如何使带有 TF 后端的 Keras 使用 CPU 而不是 GPU?
- ruby-on-rails - Rails 管理员未使用 Cancancan 或 Devise 进行身份验证
- r - UpsetR:添加数字标签以设置绘图大小
- go - 如何从这个站点下载 Protocol Buffers v3?
- c++ - 关于正确编译和运行代码的 Makefile “错误 1”
- javascript - AJAX POST 无法在 javascript 中运行到 nodejs