莫尔条纹--处理及分析 C++

2023-11-02 09:20
文章标签 分析 c++ 处理 条纹 莫尔

本文主要是介绍莫尔条纹--处理及分析 C++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

老师评语:可以再利用骨架提取做一遍,两种方法比较精度,有需要的小伙伴可以直接参考!

  1. 整体思路

通过观察原图像,图像存在噪声点,且黑色条纹边界不清晰,使用滤波、图像增强、二值化等方法对原图像进行预处理,另外为保证测量结果的准确性,使用图像三作为原图像,测量多个距离值并求均值。

 

原图像

中值滤波

图像增强(锐化)

二值化

按位取反

膨胀:矩形结构元素、十字形结构元素,效果相差不大

腐蚀:矩形结构元素、十字形结构元素,十字形效果较好,选择十字形

轮廓检测及绘制

观察图像20个轮廓特征都为不规则曲线,利用霍夫直线检测无法准确检测出直线,由于图像由一个个图像点组成所以使用直线拟合的方法,将每个由像素点组成的轮廓拟合成直线。

获取轮廓像素坐标点

直线拟合

获取拟合直线斜率及解析式

由于直线非平行直线无法直接求出图像之间的距离,求条纹间距时,两个阴影中心的距离=一个轮廓至下下轮廓的距离,使用等价代换的原则,计算直线1和直线3之间的距离。无法直接求解:方法1:两条直线,一条直线保持不变,另一条直线理解为一个个的点,求点到直线直接的距离再求均值

方法二:考虑到直线数量众多,方法一的计算量巨大,且受直线偏移影响严重。20条直线的斜率差别不大,求取20条直线的斜率,去掉最大值和最小值求均值,做出20条直线的类垂直线,求取他们之间的交点,获取交点坐标,利用公式计算交点1和交点3之间的距离,一共18个交点距离,去掉最大值和最小值求出均值,得出最终的距离49.4991个像素点。

2、程序源码

#include <iostream>

#include <opencv2/opencv.hpp>

using namespace std;

using namespace cv;

void drawLine(Mat &img, vector<Vec4i>lines, double rows, double cols, Scalar scalar, int n)

{

Point pt1, pt2;

for (size_t i = 0; i < lines.size();i++)

{

float rho = lines[i][0];

float theta = lines[i][1];

double a = cos(theta);

double b = sin(theta);

double x0 = a*rho, y0 = b*rho;

double length = max(rows, cols);

pt1.x = cvRound(x0 + length*(-b));

pt1.y = cvRound(y0 + length*(a));

pt2.x = cvRound(x0 - length*(-b));

pt2.y = cvRound(y0 - length*(a));

line(img, pt1, pt2, scalar, n);

}

}

int main() {

Mat image, gray, src, dst, gray1;//定义Mat类型的变量

image = imread("莫尔条纹3.png", 0);//读取程序文件夹中的图像,并赋值给变量image,0代表灰度图,1代表彩色图

if (!image.data) {

printf("could not find image");

return -1;

}

namedWindow("image", WINDOW_AUTOSIZE); //定义用户可调节大小的窗口,并命名为image

imshow("image", image);  //在image窗口里展示image图像

int w = image.cols;

int h = image.rows;

cout << "图像宽:" << w << endl;

cout << "图像高:" << h << endl;

//图像去噪(中值滤波)

medianBlur(image, src, 7);

imshow("meidan denoise demo", src);

//图像锐化

Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

filter2D(src, dst, src.depth(), kernel);

imshow("锐化", dst);

//二值化

threshold(dst, gray, 120, 255, THRESH_BINARY );

imshow("gray", gray);

//按位取反

bitwise_not(gray, gray1);

imshow("gray1",gray1);

//形态学操作-膨胀

Mat struct1, struct2;

struct1 = getStructuringElement(0, Size(3, 3));  //矩形结构元素

struct2 = getStructuringElement(1, Size(3, 3));  //十字结构元素

Mat dilateGray, dilateGray1;

dilate(gray1, dilateGray, struct1, Point(-1, -1), 1);

dilate(gray1, dilateGray1, struct2, Point(-1, -1), 2);

imshow("dilateGray", dilateGray);

imshow("erodeGray1", dilateGray1);

//形态学操作-腐蚀

Mat erodeGray, erodeGray1;

Mat struct3, struct4;

struct3 = getStructuringElement(0, Size(3, 3));  //矩形结构元素

struct4 = getStructuringElement(1, Size(3, 3));  //十字结构元素

erode(dilateGray, erodeGray, struct3, Point(-1, -1), 3);

erode(dilateGray, erodeGray1, struct4, Point(-1, -1), 3);

imshow("erodeGray", erodeGray);

imshow("erodeGray1", erodeGray1);

Mat edge;

Canny(erodeGray, edge, 80, 180, 3, false);

//imshow("edge",edge);

//轮廓发现与绘制

vector<vector<Point>> contours;

vector<Vec4i> hierarchy;

Vec4f line0, line1, line2, line3, line4, line5, line6, line7, line8,line9,line10,line11,line12,line13,line14,line15, line16, line17, line18,line19;

findContours(edge, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

//绘制轮廓

for (int t = 0; t < hierarchy.size(); t++)

{

drawContours(edge, contours, t, Scalar(255, 255, 255), 1, 4);

//printf("%d", t);

}

int m0, n0;

for (m0 = 0; m0 < contours.size(); m0++)

{

for (n0 = 0; n0 < contours[m0].size(); n0++)

cout << contours[m0][n0] << "";

cout << "\n";

}

//显示结果

imshow("轮廓绘制结果", edge);

vector<Point2f>point_0;

vector<Point2f>point_1;

vector<Point2f>point_2;

vector<Point2f>point_3;

vector<Point2f>point_4;

vector<Point2f>point_5;

vector<Point2f>point_6;

vector<Point2f>point_7;

vector<Point2f>point_8;

vector<Point2f>point_9;

vector<Point2f>point_10;

vector<Point2f>point_11;

vector<Point2f>point_12;

vector<Point2f>point_13;

vector<Point2f>point_14;

vector<Point2f>point_15;

vector<Point2f>point_16;

vector<Point2f>point_17;

vector<Point2f>point_18;

vector<Point2f>point_19;

int m, n;

for (m = 0; m < contours.size(); m++)

{

for (n = 0; n < contours[m].size(); n++)

{

switch (m)

{

case 0:

point_0.push_back(contours[m][n]);

break;

case 1:

point_1.push_back(contours[m][n]);

break;

case 2:

point_2.push_back(contours[m][n]);

break;

case 3:

point_3.push_back(contours[m][n]);

break;

case 4:

point_4.push_back(contours[m][n]);

break;

case 5:

point_5.push_back(contours[m][n]);

break;

case 6:

point_6.push_back(contours[m][n]);

break;

case 7:

point_7.push_back(contours[m][n]);

break;

case 8:

point_8.push_back(contours[m][n]);

break;

case 9:

point_9.push_back(contours[m][n]);

break;

case 10:

point_10.push_back(contours[m][n]);

break;

case 11:

point_11.push_back(contours[m][n]);

break;

case 12:

point_12.push_back(contours[m][n]);

break;

case 13:

point_13.push_back(contours[m][n]);

break;

case 14:

point_14.push_back(contours[m][n]);

break;

case 15:

point_15.push_back(contours[m][n]);

break;

case 16:

point_16.push_back(contours[m][n]);

break;

case 17:

point_17.push_back(contours[m][n]);

break;

case 18:

point_18.push_back(contours[m][n]);

break;

case 19:

point_19.push_back(contours[m][n]);

break;

default:

cout << "input error" << endl;

}

}

}

Mat img(321, 432,CV_8UC1, cv::Scalar(0));

//直线拟合0

fitLine(point_0, line0, DIST_L1, 0, 0.01, 0.01);

cout << line0 << endl;

double k0 = line0[1] / line0[0];

cout << "直线斜率0:  " << k0 << endl;

double A0 = k0, B0 = -1, C0 = line0[3] - k0*line0[2] ;

cout << "直线解析式:" << A0 << "x " << B0 << "y +" << C0 << " = 0 " << endl;

Point point00, point01;

point00.x = 0;

point00.y = C0;

point01.y = 321;

point01.x = (321-C0)/k0;

line(img, point00, point01, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合1

fitLine(point_1, line1, DIST_L1, 0, 0.01, 0.01);

cout << line1 << endl;

double k1 = line1[1] / line1[0];

cout << "直线斜率1:  " << k1 << endl;

double A1 = k1, B1 = -1, C1 = line1[3] - k1*line1[2] ;

cout << "直线解析式:" << A1 << "x " << B1 << "y +" << C1 << " = 0 " << endl;

Point point10, point11;

point10.x = 0;

point10.y = C1;

point11.y = 321;

point11.x = (321 - C1) / k1;

line(img, point10, point11, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合2

fitLine(point_2, line2, DIST_L1, 0, 0.01, 0.01);

double k2 = line2[1] / line2[0];

cout << "直线斜率2:  " << k2 << endl;

double A2 = k2, B2 = -1, C2 = line2[3] - line2[2] * k2;

cout << "直线解析式:" << A2 << "x " << B2 << "y +" << C2 << " = 0 " << endl;

Point point20, point21;

point20.x = 0;

point20.y = C2;

point21.y = 321;

point21.x = (321 - C2) / k2;

line(img, point20, point21, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合3

fitLine(point_3, line3, DIST_L1, 0, 0.01, 0.01);

double k3 = line3[1] / line3[0];

cout << "直线斜率3:  " << k3 << endl;

double A3 = k3, B3 = -1, C3 = line3[3] - line3[2] * k3;

cout << "直线解析式:" << A3 << "x " << B3 << "y +" << C3 << " = 0 " << endl;

Point point30, point31;

point30.x = 0;

point30.y = C3;

point31.y = 321;

point31.x = (321 - C3) / k3;

line(img, point30, point31, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合4

fitLine(point_4, line4, DIST_L1, 0, 0.01, 0.01);

double k4 = line4[1] / line4[0];

cout << "直线斜率4:  " << k4 << endl;

double A4 = k4, B4 = -1, C4 =  line4[3] - line4[2] * k4;

cout << "直线解析式:" << A4 << "x " << B4 << "y +" << C4 << " = 0 " << endl;

Point point40, point41;

point40.x = 0;

point40.y = C4;

point41.y = 321;

point41.x = (321 - C4) / k4;

line(img, point40, point41, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合5

fitLine(point_5, line5, DIST_L1, 0, 0.01, 0.01);

double k5 = line5[1] / line5[0];

cout << "直线斜率5:  " << k5 << endl;

double A5 = k5, B5 = -1, C5 = line5[3] - line5[2] * k5;

cout << "直线解析式:" << A5 << "x " << B5 << "y +" << C5 << " = 0 " << endl;

Point point50, point51;

point50.x = 0;

point50.y = C5;

point51.y = 321;

point51.x = (321 - C5) / k5;

line(img, point50, point51, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合6

fitLine(point_6, line6, DIST_L1, 0, 0.01, 0.01);

double k6 = line6[1] / line6[0];

cout << "直线斜率6:  " << k6 << endl;

double A6 = k6, B6 = -1, C6 = line6[3] - line6[2] * k6;

cout << "直线解析式:" << A6 << "x " << B6 << "y +" << C6 << " = 0 " << endl;

Point point60, point61;

point60.x = 0;

point60.y = C6;

point61.y = 321;

point61.x = (321 - C6) / k6;

line(img, point60, point61, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合7

fitLine(point_7, line7, DIST_L1, 0, 0.01, 0.01);

double k7 = line7[1] / line7[0];

cout << "直线斜率7:  " << k7 << endl;

double A7 = k7, B7 = -1, C7 = line7[3] - line7[2] * k7;

cout << "直线解析式:" << A7 << "x " << B7 << "y +" << C7 << " = 0 " << endl;

Point point70, point71;

point70.x = 0;

point70.y = C7;

point71.y = 321;

point71.x = (321 - C7) / k7;

line(img, point70, point71, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合8

fitLine(point_8, line8, DIST_L1, 0, 0.01, 0.01);

double k8 = line8[1] / line8[0];

cout << "直线斜率8:  " << k8 << endl;

double A8 = k8, B8 = -1, C8 = line8[3] - line8[2] * k8;

cout << "直线解析式:" << A8 << "x " << B8 << "y " << C8 << " = 0 " << endl;

Point point80, point81;

point80.x = 0;

point80.y = C8;

point81.y = 321;

point81.x = (321 - C8) / k8;

line(img, point80, point81, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合9

fitLine(point_9, line9, DIST_L1, 0, 0.01, 0.01);

double k9 = line9[1] / line9[0];

cout << "直线斜率9:  " << k9 << endl;

double A9 = k9, B9 = -1, C9 = line9[3] - line9[2] * k9;

cout << "直线解析式:" << A9 << "x " << B9 << "y +" << C9 << " = 0 " << endl;

Point point90, point91;

point90.x = 0;

point90.y = C9;

point91.y = 321;

point91.x = (321 - C9) / k9;

line(img, point90, point91, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合10

fitLine(point_10, line10, DIST_L1, 0, 0.01, 0.01);

double k10 = line10[1] / line10[0];

cout << "直线斜率10:  " << k10 << endl;

double A10 = k10, B10 = -1, C10 =  line10[3] - line10[2] * k10;

cout << "直线解析式:" << A10 << "x " << B10 << "y +"<< C10 << " = 0 " << endl;

Point point100, point101;

point100.x = -C10/A10;

point100.y = 0;

point101.x = 432;

point101.y = A10 * 432 + C10;

line(img, point100, point101, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合11

fitLine(point_11, line11, DIST_L1, 0, 0.01, 0.01);

double k11 = line11[1] / line11[0];

cout << "直线斜率11:  " << k11 << endl;

double A11 = k11, B11 = -1, C11 = line11[3] - line11[2] * k11;

cout << "直线解析式:" << A11 << "x " << B11 << "y " << C11 << " = 0 " << endl;

Point point110, point111;

point110.x = -C11 / A11;

point110.y = 0;

point111.x = 432;

point111.y = A11 * 432 + C11;

line(img, point110, point111, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合12

fitLine(point_12, line12, DIST_L1, 0, 0.01, 0.01);

double k12 = line12[1] / line12[0];

cout << "直线斜率12:  " << k12 << endl;

double A12 = k12, B12 = -1, C12 = line12[3] - line12[2] * k12;

cout << "直线解析式:" << A12 << "x " << B12 << "y " << C12 << " = 0 " << endl;

Point point120, point121;

point120.x = -C12 / A12;

point120.y = 0;

point121.x = 432;

point121.y = A12 * 432 + C12;

line(img, point120, point121, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合13

fitLine(point_13, line13, DIST_L1, 0, 0.01, 0.01);

double k13 = line13[1] / line13[0];

cout << "直线斜率13:  " << k13 << endl;

double A13 = k13, B13 = -1, C13 = line13[3] - line13[2] * k13;

cout << "直线解析式:" << A13 << "x " << B13 << "y " << C13 << " = 0 " << endl;

Point point130, point131;

point130.x = -C13 / A13;

point130.y = 0;

point131.x = 432;

point131.y = A13 * 432 + C13;

line(img, point130, point131, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合14

fitLine(point_14, line14, DIST_L1, 0, 0.01, 0.01);

double k14 = line14[1] / line14[0];

cout << "直线斜率14:  " << k14 << endl;

double A14 = k14, B14 = -1, C14 = line14[3] - line14[2] * k14;

cout << "直线解析式:" << A14 << "x " << B14 << "y " << C14 << " = 0 " << endl;

Point point140, point141;

point140.x = -C14 / A14;

point140.y = 0;

point141.x = 432;

point141.y = A14 * 432 + C14;

line(img, point140, point141, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合15

fitLine(point_15, line15, DIST_L1, 0, 0.01, 0.01);

double k15 = line15[1] / line15[0];

cout << "直线斜率15:  " << k15 << endl;

double A15 = k15, B15 = -1, C15 = line15[3] - line15[2] * k15;

cout << "直线解析式:" << A15 << "x " << B15 << "y " << C15 << " = 0 " << endl;

Point point150, point151;

point150.x = -C15 / A15;

point150.y = 0;

point151.x = 432;

point151.y = A15 * 432 + C15;

line(img, point150, point151, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合16

fitLine(point_16, line16, DIST_L1, 0, 0.01, 0.01);

double k16 = line16[1] / line16[0];

cout << "直线斜率16:  " << k16 << endl;

double A16 = k16, B16 = -1, C16 = line16[3] - line16[2] * k16;

cout << "直线解析式:" << A16 << "x " << B16 << "y " << C16 << " = 0 " << endl;

Point point160, point161;

point160.x = -C16 / A16;

point160.y = 0;

point161.x = 432;

point161.y = A16 * 432 + C16;

line(img, point160, point161, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合17

fitLine(point_17, line17, DIST_L1, 0, 0.01, 0.01);

double k17 = line17[1] / line17[0];

cout << "直线斜率17:  " << k17 << endl;

double A17 = k17, B17 = -1, C17 = line17[3] - line17[2] * k17;

cout << "直线解析式:" << A17 << "x " << B17 << "y " << C17 << " = 0 " << endl;

Point point170, point171;

point170.x = -C17 / A17;

point170.y = 0;

point171.x = 432;

point171.y = A17 * 432 + C17;

line(img, point170, point171, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合18

fitLine(point_18, line18, DIST_L1, 0, 0.01, 0.01);

double k18 = line18[1] / line18[0];

cout << "直线斜率18:  " << k18 << endl;

double A18 = k18, B18 = -1, C18 = line18[3] - line18[2] * k18;

cout << "直线解析式:" << A18 << "x " << B18 << "y " << C18 << " = 0 " << endl;

Point point180, point181;

point180.x = -C18 / A18;

point180.y = 0;

point181.x = 432;

point181.y = A18 * 432 + C18;

line(img, point180, point181, Scalar(255, 255, 255), 1, LINE_8, 0);

//直线拟合19

fitLine(point_19, line19, DIST_L1, 0, 0.01, 0.01);

double k19 = line19[1] / line19[0];

cout << "直线斜率19:  " << k19 << endl;

double A19 = k19, B19 = -1, C19 = line19[3] - line19[2] * k19;

cout << "直线解析式:" << A19 << "x " << B19 << "y " << C19 << " = 0 " << endl;

Point point190, point191;

point190.x = -C19 / A19;

point190.y = 0;

point191.x = 432;

point191.y = A19 * 432 + C19;

line(img, point190, point191, Scalar(255, 255, 255), 1, LINE_8, 0);

//舍弃最大值及最小值,求斜率均值

double a[20] = { k0,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18,k19 };

double sum = 0;

int num = 20;

//for 循环判断最大值和最小值

double max = a[0];

double min = a[0];

for (int i = 0; i < 20; i++)

{

if (a[i] > max)

max = a[i];

if (a[i] < min)

min = a[i];

sum += a[i];

}

cout << "max=" << max << endl;

cout << "min=" << min << endl;

cout << "sum1=" << sum << endl;

cout << "num1=" << num << endl;

//for循环去除最大值和最小值

for (int i = 0; i < 20; i++)

{

if (a[i] == max || a[i] == min)

{

sum -= a[i];

num--;

}

}

cout << "sum2=" << sum << endl;

cout << "num2=" << num << endl;

double avg = sum / num;

cout << "avg=" << avg << endl;

double b = atan(avg);            //弧度制

double c = b * 180 / 3.1415926;  //角度制

cout << "角度:" << c << endl;

double d = 90 - c;

cout << "垂线角度:" << d << endl;

double e = tan(d*3.1415926/180);

cout << "垂线斜率:" << e << endl;

//辅助线的一般直线公式

double AA = 321, BB = 218, CC = -321 * 218;

cout << "辅助直线解析式:" << AA<< "x +" << BB << "y " << CC << " = 0 " << endl;

//直线绘制

line(img,Point(0,321), Point(218,0),Scalar(255,255,255),1,LINE_8,0);

imshow("辅助线绘制", img);

//求取直线交点

double A[20] = { A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19 };

double B[20] = { B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17,B18,B19 };

double C[20] = { C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 };

double D[20], x[20], y[20];

for (int i = 0; i < 20; i++)

{

D[i] = A[i] * BB - AA * B[i];

x[i] = (B[i] * CC - BB * C[i]) / D[i];

y[i] = (AA * C[i] - A[i] * CC) / D[i];

cout << "交点坐标:" << x[i] << "," << y[i] << endl;

}

//x从小到大排列数组

double tempx;

double tempy;

for (int i = 1; i < 20; i++)

{

for (int j = i - 1; j >= 0; j--)

{

if (x[j + 1] < x[j])

{

tempx = x[j];

x[j] = x[j + 1];

x[j + 1] = tempx;

}

else break;

}

}

for (int i = 0; i < 20; i++)

{

cout << x[i] << endl;

}

//y从大到小排列数组

for (int i = 1; i < 20; i++)

{

for (int j = i - 1; j >= 0; j--)

{

if (y[j + 1] > y[j])

{

tempy = y[j];

y[j] = y[j + 1];

y[j + 1] = tempy;

}

else break;

}

}

for (int i = 0; i < 20; i++)

{

cout <<"排列后的交点坐标"<<x[i]<<","<< y[i] << endl;

}

//计算距离

double dis[18];

for (int i = 0; i < 18; i++)

{

int j = i + 2;

dis[i] = sqrt(pow((x[j] - x[i]),2) + pow((y[j] - y[i]),2));//pow平方,sqrt开平方

}

for (int i = 0; i < 18; i++)

{

cout << dis[i] << endl;

}

//去掉距离最大值、最小值,求平均

double sum_dis = 0;

//for 循环判断最大值和最小值

double max_dis = dis[0];

double min_dis = dis[0];

for (int i = 0; i < 18; i++)

{

if (dis[i] > max_dis)

max_dis = dis[i];

if (dis[i] < min_dis)

min_dis = dis[i];

sum_dis += dis[i];

}

cout << "max=" << max_dis << endl;

cout << "min=" << min_dis << endl;

cout << "sum1=" << sum_dis << endl;

//for循环去除最大值和最小值

for (int i = 0; i < 18; i++)

{

if (dis[i] == max_dis || dis[i] == min_dis)

{

sum_dis -= dis[i];

}

}

double avg_dis = sum_dis / 16;

cout << "莫尔条纹间距总和为: " << sum_dis << endl;

cout << "莫尔条纹间距为: " << avg_dis << endl;

/*//霍夫直线检测

vector<Vec4i> lines1, lines2;

HoughLinesP(edge, lines1, 5, CV_PI / 180.0, 150, 100, 1000);

HoughLinesP(edge, lines2, 5, CV_PI / 180.0, 150, 30, 30);

Mat img1, img2;

edge.copyTo(img1);

edge.copyTo(img2);

drawLine(img1, lines1, edge.rows, edge.cols, Scalar(255), 1);

drawLine(img2, lines2, edge.rows, edge.cols, Scalar(255), 1);

imshow("img1", img1);

imshow("img2", img2);*/

waitKey(0);

return 0;

}

这篇关于莫尔条纹--处理及分析 C++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329635

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者