• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

OpenCV如何提取图片中曲线

c语言 搞代码 4年前 (2022-01-06) 62次浏览 已收录 0个评论

这篇文章主要为大家详细介绍了OpenCV如何提取图片中曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

简单介绍

  在实际的应用中,我们常常需要对图像中的曲线进行描述、处理,这个曲线可以是轮廓,骨架或者其他。可以用deque 描述曲线,接下来简单介绍下如何从图片中搜索这些曲线并保存。

  首先,输入的图片是一张二值图片 (白色为曲线),其中包含的曲线宽度为 1 像素的 (如果曲线不是 1 像素的 先提取其骨架)。遍历寻找图像中第一个白色的点,然后从这个点开始延伸寻找曲线。注意,第一个找到的点不一定是曲线的端点,因此应该分别向两边寻找相邻的点,因此deque 会好一些。每找到一个点,将其保存deque 而后置黑(防止重复寻找)。搜索到一个没有相邻点的点,表示一端搜索完成。

   值得注意的一点是,我在写搜寻相邻点的时候,会首先搜寻此点与上一个点相邻位置相对的位置,如果没有,则分别搜索向两边搜索。这样的好处是可以减少寻找的次数,而且当有相交的曲线时,能连接到我们一般认为的曲线。

代码

 //寻找图像曲线上某个点的下一个点 bool findNextPoint(vector &_neighbor_points, Mat &_image, Point _inpoint, int flag, Point& _outpoint, int &_outflag) { int i = flag; int count = 1; bool success = false; while (count  0 && tmppoint.y > 0 && tmppoint.x <_image.cols&&tmppoint.y <_image.rows) { if (_image.at(tmppoint) == 255) { _outpoint = tmppoint; _outflag = i; success = true; _image.at(tmppoint) = 0; break; } } if (count % 2) { i += count; if (i > 7) { i -= 8; } } else { i += -count; if (i <0) { i += 8; } } count++; } return success; } //寻找图像上的第一个点 bool findFirstPoint(Mat &_inputimg, Point &_outputpoint) { bool success = false; for (int i = 0; i <_inputimg.rows; i++) { uchar* data = _inputimg.ptr(i); for (int j = 0; j <_inputimg.cols; j++) { if (data[j] == 255) { success = true; _outputpoint.x = j; _outputpoint.y = i; data[j] = 0; break; } } if (success) break; } return success; } //寻找曲线 void findLines(Mat &_inputimg, vector<deque> &_outputlines) { vector neighbor_points = { Point(-1,-1),Point(0,-1),Point(1,-1),Point(1,0),Point(1,1),Poi<span style="color:transparent">来源gaodai#ma#com搞*!代#%^码网</span>nt(0,1),Point(-1,1),Point(-1,0) }; Point first_point; while (findFirstPoint(_inputimg, first_point)) { deque line; line.push_back(first_point); //由于第一个点不一定是线段的起始位置,双向找 Point this_point = first_point; int this_flag = 0; Point next_point; int next_flag; while (findNextPoint(neighbor_points, _inputimg, this_point, this_flag, next_point, next_flag)) { line.push_back(next_point); this_point = next_point; this_flag = next_flag; } //找另一边 this_point = first_point; this_flag = 0; //cout << "flag:" << this_flag < 10) { _outputlines.push_back(line); } } } //随机取色 用于画线的时候 Scalar random_color(RNG& _rng) { int icolor = (unsigned)_rng; return Scalar(icolor & 0xFF, (icolor >> 8) & 0xFF, (icolor >> 16) & 0xFF); } int main() { Mat image = imread("images\\2.bmp"); Mat gray; cvtColor(image, gray, CV_BGR2GRAY); vector<deque> lines; findLines(gray, lines); cout << lines.size() << endl; //draw lines Mat draw_img = image.clone(); RNG rng(123); Scalar color; for (int i = 0; i <lines.size(); i++) { color = random_color(rng); for (int j = 0; j <lines[i].size(); j++) { draw_img.at(lines[i][j]) = Vec3b(color[0], color[1], color[2]); } } imshow("draw_img", draw_img); imwrite("images\\draw_img.bmp", draw_img); waitKey(0); system("pause"); return 0; }

结果

输入图像

结果

以上就是OpenCV如何提取图片中曲线的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:OpenCV如何提取图片中曲线

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址