1. 程式人生 > >OpenCV 遍歷兩點直線上的所有點

OpenCV 遍歷兩點直線上的所有點

功能需求:計算影象中的直線,並過濾掉水平和垂直的直線。

原始碼

#include <iostream>
#include <vector>
#include <string>

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

void findLines(cv::Mat& binary)
{
    std::vector<cv::Vec4i> tmp_lines;
    HoughLinesP(
        binary,
        tmp_lines,
        1
, 3.1415926 / 180, 5, 0.0, 0.0 ); std::vector<cv::Vec4i>::const_iterator itr = tmp_lines.begin(); cv::Point pt1, pt2; for (; itr != tmp_lines.end(); ++itr) { pt1.x = (*itr)[0]; pt1.y = (*itr)[1]; pt2.x = (*itr)[2]; pt2.y = (*itr)[3
]; float line_angle = atan2(pt1.y - pt2.y, pt1.x - pt2.x); line_angle *= 57.19577951; // 180 / CV_PI std::cout << line_angle << '\n'; const float deta = 5.0f; float abslangle = abs(line_angle - deta); if (abslangle < 0 || abslangle < 90 || abslangle < 180
|| abslangle < 270) { cv::LineIterator lit(binary, pt1, pt2, 8); for (int i = 0; i < lit.count; i++, ++lit) { cv::Point pt(lit.pos()); //int val = binary.at<uchar>(pt.y, pt.x); //std::cout << pt.y << "," << pt.x << "-->" << val << std::endl; binary.at<uchar>(pt.y, pt.x) = 0; } continue; } } } int main(int argc, char* argv[]) { cv::Mat img = cv::imread("D:/test.jpg", 0); cv::Mat edges; cv::Canny(img, edges, 30, 75); cv::imwrite("D:/edges.jpg", edges); findLines(edges); cv::imwrite("D:/res.jpg", edges); return 0; }

參考