OpenCV_Code_LOG

孔洞填充

cpp 复制代码
void fillHole(const Mat srcBw, Mat &dstBw)
{
    Size m_Size = srcBw.size();
    Mat Temp=Mat::zeros(m_Size.height+2,m_Size.width+2,srcBw.type());//延展图像
    srcBw.copyTo(Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)));

    cv::floodFill(Temp, Point(0, 0), Scalar(255,255,255));

    Mat cutImg;//裁剪延展的图像
    Temp(Range(1, m_Size.height + 1), Range(1, m_Size.width + 1)).copyTo(cutImg);

    dstBw = srcBw | (~cutImg);
}
cpp 复制代码
fillHole(ThrImg, ThrImg);
cpp 复制代码
https://blog.csdn.net/wangyaninglm/article/details/47701047?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-47701047-blog-128034901.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3


转换

16位转8位

cpp 复制代码
cvtColor(OpenImage,OpenImage,COLOR_BGR2GRAY);

字符串转换

cpp 复制代码
std::to_string(i)

cpp 复制代码
 //生成随机颜色,用于区分不同连通域
    RNG rng(10086);

    Mat out;
    int number=connectedComponents(OpenImage,out,8,CV_16U);//统计图像连通域的个数
    vector<Vec3b>colors;
    for(int i=0;i<number;++i){
        //使用均匀分布的随机确定颜色
        Vec3b vec3=Vec3b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));
        colors.push_back(vec3);
    }
    //以不同颜色标记出不同的连通域
    Mat result=Mat::zeros(OpenImage.size(),SrcImage_1.type());
    int w=result.cols;
    int h=result.rows;
    for(int row=0;row<h;++row){
        for(int col=0;col<w;++col){
            int label=out.at<uint16_t>(row,col);
            if(label==0){//背景的黑色不改变
                continue;
            }
            result.at<Vec3b>(row,col)=colors[label];
        }
    }

    imshow("标记后的图像",result);
cpp 复制代码
https://blog.csdn.net/qq_33287871/article/details/112691790

图像混合:

cpp 复制代码
float alpha=0.5; Mat MixImage;
addWeighted(ConnectImg, alpha, SrcImage_1, 1 - alpha, 0, MixImage);

中值滤波(去二值化图像毛刺):

cpp 复制代码
medianBlur(ConnectImg,ConnectImg,9);
cpp 复制代码
https://ask.csdn.net/questions/375741

霍夫直线检测

cpp 复制代码
//1、边缘检测
Canny(ConnectImg, CanImg, position, 255, 3);
imshow("CanImg", CanImg);

vector<Vec4i> lines; // 存储检测到的直线
HoughLinesP(CloseImage, lines, 1, CV_PI / 180, 80, 30, 10); // 应用霍夫直线检测算法,输入图像必须是边缘检测后的图像 因为它需要的是边缘信息或者梯度信息来找到线段。
for (size_t i = 0; i < lines.size(); i++)
{
    Vec4i l = lines[i];
    line(SrcImage_1, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA); //直线必须画在三通道的RGB图像中
}
imshow("HoughSrcImage_1", SrcImage_1);

LSD直线检测


方法一:

cpp 复制代码
#include <iostream>
#include <string>
#include "opencv2/core/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"

    //1、边缘检测
Canny(ConnectImg, CanImg, 0, 255, 3);
imshow("CanImg", CanImg);

Ptr<LineSegmentDetector> LS=createLineSegmentDetector(LSD_REFINE_STD); 
vector<Vec4f>lines_LSD;
LS->detect(CanImg,lines_LSD);
Mat drawLSDlines(CanImg);
LS->drawSegments(drawLSDlines,lines_LSD);
imshow("LSD",drawLSDlines);

方法二:

cpp 复制代码
Ptr<LineSegmentDetector> detector = createLineSegmentDetector();

vector<Vec4f> lines;
detector->detect(CanImg,
                 lines);

Mat resultLSD(CanImg.size(),
        CV_8UC3,
           Scalar(0, 0, 0));

Scalar color(0,0,255);
int thickness = 1;
cout<<"lines.size : "<<lines.size();
for(int i=0; i<lines.size(); i++)
{
    Point start(static_cast<int>(lines[i][0]), static_cast<int>(lines[i][1]));
         Point end(static_cast<int>(lines[i][2]), static_cast<int>(lines[i][3]));

         line(resultLSD, start, end, color, thickness);
}
imshow("resultLSD", resultLSD);

点距离直线筛选(检查直线是否与圆相交)

cpp 复制代码
bool isLineIntersectsCircle(const Vec4i& line, const Point& circleCenter, int circleRadius) {
    Point start(line[0], line[1]);
    Point end(line[2], line[3]);

    // 使用点到直线距离来判断是否相交
    double dist = pointToLineDistance(circleCenter, start, end);
    if (dist <= circleRadius) {
        return true;
    }

    // 补充:检查圆心是否在直线上(重要!)
    double dotProduct = ((end.x - start.x) * (circleCenter.x - start.x) + (end.y - start.y) * (circleCenter.y - start.y));
    double squaredLength = (end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y);

    if (squaredLength != 0) {
        double param = dotProduct / squaredLength;
        if (param >= 0 && param <= 1) {
           Point closestPoint;
           closestPoint.x = start.x + param * (end.x - start.x);
           closestPoint.y = start.y + param * (end.y - start.y);
           double distanceFromCenter = norm(circleCenter - closestPoint); //计算圆心到最近点的距离
           if (distanceFromCenter <= circleRadius) {
             return true;
           }
        }
    }

    return false;
}

函数调用:

cpp 复制代码
   Point circleCenter1(140, 135); // 替换为你的圆心坐标(别忘了你图像缩小了6倍)
    Point circleCenter2(690, 72); // 替换为你的圆心坐标
    int circleRadius =60;


    //  使用 std::vector<int> 来存储与圆相交的第一条直线
        std::vector<int> intersectingLineIndices;
        for (size_t i = 0; i < extendedLines.size(); ++i) {
            if (isLineIntersectsCircle(extendedLines[i], circleCenter1, circleRadius)) {
                intersectingLineIndices.push_back(i);
                break; // 找到一条后立即退出循环,避免继续查找
            }
        }

        // 检验是否存在相交线
            if (!intersectingLineIndices.empty()) {
                int index = intersectingLineIndices[0];
                line(SrcImage_1, Point(extendedLines[index][0], extendedLines[index][1]),
                     Point(extendedLines[index][2], extendedLines[index][3]), Scalar(0, 0, 255), 2);
                std::cout << "Found intersecting line at index " << index << std::endl;
            }
            else {
                std::cout << "No intersecting line found." << std::endl;
            }
相关推荐
CoovallyAIHub30 分钟前
YOLO模型优化全攻略:从“准”到“快”,全靠这些招!
深度学习·算法·计算机视觉
机器之心1 小时前
刚刚,苹果基础模型团队负责人庞若鸣被Meta挖走!加入超级智能团队、年薪千万美元
人工智能
G.E.N.2 小时前
开源!RAG竞技场(2):标准RAG算法
大数据·人工智能·深度学习·神经网络·算法·llm·rag
西西弗Sisyphus2 小时前
如果让计算机理解人类语言- Word2Vec(Word to Vector,2013)
人工智能·word·word2vec
前端双越老师2 小时前
30 行代码 langChain.js 开发你的第一个 Agent
人工智能·node.js·agent
东坡肘子2 小时前
高温与奇怪的天象 | 肘子的 Swift 周报 #092
人工智能·swiftui·swift
KaneLogger3 小时前
视频转文字,别再反复拖进度条了
前端·javascript·人工智能
度假的小鱼3 小时前
从 “人工编码“ 到 “AI 协同“:大模型如何重塑软件开发的效率与范式
人工智能
zm-v-159304339864 小时前
ArcGIS 水文分析升级:基于深度学习的流域洪水演进过程模拟
人工智能·深度学习·arcgis