OpenCV检测角点

2023-11-17

harris角点检测算法步骤

  1.利用Soble计算出XY方向的梯度值

  2.计算出Ix^2,Iy^2,Ix*Iy

  3.利用高斯函数对Ix^2,Iy^2,Ix*Iy进行滤波

  4.计算局部特征结果矩阵M的特征值和响应函数C(i,j)=Det(M)-k(trace(M))^2   (0.04<=k<=0.06)

  5.将计算出响应函数的值C进行非极大值抑制,滤除一些不是角点的点,同时要满足大于设定的阈值
 

#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include <iostream>  
#include <cmath>
using namespace cv;
using namespace std;
/*
RGB转换成灰度图像的一个常用公式是:
Gray = R*0.299 + G*0.587 + B*0.114
*/
//******************灰度转换函数*************************  
//第一个参数image输入的彩色RGB图像的引用;  
//第二个参数imageGray是转换后输出的灰度图像的引用;  
//*******************************************************
void ConvertRGB2GRAY(const Mat &image, Mat &imageGray);
 
//******************Sobel卷积因子计算X、Y方向梯度和梯度方向角********************  
//第一个参数imageSourc原始灰度图像;  
//第二个参数imageSobelX是X方向梯度图像;  
//第三个参数imageSobelY是Y方向梯度图像;  
//第四个参数pointDrection是梯度方向角数组指针  
//*************************************************************  
void SobelGradDirction(Mat &imageSource, Mat &imageSobelX, Mat &imageSobelY);
 
//******************计算Sobel的X方向梯度幅值的平方*************************  
//第一个参数imageGradX是X方向梯度图像;    
//第二个参数SobelAmpXX是输出的X方向梯度图像的平方  
//*************************************************************  
void SobelXX(const Mat imageGradX, Mat_<float> &SobelAmpXX);
 
//******************计算Sobel的Y方向梯度幅值的平方*************************    
//第一个参数imageGradY是Y方向梯度图像;  
//第二个参数SobelAmpXX是输出的Y方向梯度图像的平方  
//*************************************************************  
void SobelYY(const Mat imageGradY, Mat_<float> &SobelAmpYY);
 
//******************计算Sobel的XY方向梯度幅值的乘积*************************    
//第一个参数imageGradX是X方向梯度图像;
//第二个参数imageGradY是Y方向梯度图像;
//第二个参数SobelAmpXY是输出的XY方向梯度图像 
//*************************************************************  
void SobelXY(const Mat imageGradX, const Mat imageGradY, Mat_<float> &SobelAmpXY);
 
//****************计算一维高斯的权值数组*****************
//第一个参数size是代表的卷积核的边长的大小
//第二个参数sigma表示的是sigma的大小
//*******************************************************
double *getOneGuassionArray(int size, double sigma);
 
//****************高斯滤波函数的实现*****************
//第一个参数srcImage是代表的输入的原图
//第二个参数dst表示的是输出的图
//第三个参数size表示的是卷积核的边长的大小
//*******************************************************
void MyGaussianBlur(Mat_<float> &srcImage, Mat_<float> &dst, int size);
 
//****计算局部特涨结果矩阵M的特征值和响应函数H = (A*B - C) - k*(A+B)^2******
//M
//A  C
//C  B
//Tr(M)=a+b=A+B
//Det(M)=a*b=A*B-C^2
//计算输出响应函数的值得矩阵
//****************************************************************************
void harrisResponse(Mat_<float> &GaussXX, Mat_<float> &GaussYY, Mat_<float> &GaussXY, Mat_<float> &resultData,float k);
 
 
//***********非极大值抑制和满足阈值及某邻域内的局部极大值为角点**************
//第一个参数是响应函数的矩阵
//第二个参数是输入的灰度图像
//第三个参数表示的是输出的角点检测到的结果图
void LocalMaxValue(Mat_<float> &resultData, Mat &srcGray, Mat &ResultImage,int kSize);
 
int main()
{
	const Mat srcImage = imread("3.jpg");
	if (!srcImage.data)
	{
		printf("could not load image...\n");
		return -1;
	}
	imshow("srcImage", srcImage);
	Mat srcGray;
	ConvertRGB2GRAY(srcImage, srcGray);
	Mat imageSobelX;
	Mat imageSobelY;
	Mat resultImage;
	Mat_<float> imageSobelXX;
	Mat_<float> imageSobelYY;
	Mat_<float> imageSobelXY;
	Mat_<float> GaussianXX;
	Mat_<float> GaussianYY;
	Mat_<float> GaussianXY;
	Mat_<float> HarrisRespond;
	//计算Soble的XY梯度
	SobelGradDirction(srcGray, imageSobelX, imageSobelY);
	//计算X方向的梯度的平方
	SobelXX(imageSobelX, imageSobelXX);
	SobelYY(imageSobelY, imageSobelYY);
	SobelXY(imageSobelX, imageSobelY, imageSobelXY);
	//计算高斯模糊XX YY XY
	MyGaussianBlur(imageSobelXX, GaussianXX,3);
	MyGaussianBlur(imageSobelYY, GaussianYY, 3);
	MyGaussianBlur(imageSobelXY, GaussianXY, 3);
	harrisResponse(GaussianXX, GaussianYY, GaussianXY, HarrisRespond, 0.05);
	LocalMaxValue(HarrisRespond, srcGray, resultImage, 3);
	imshow("imageSobelX", imageSobelX);
	imshow("imageSobelY", imageSobelY);
	imshow("resultImage", resultImage);
	waitKey(0);
	return 0;
}
void ConvertRGB2GRAY(const Mat &image, Mat &imageGray)
{
	if (!image.data || image.channels() != 3)
	{
		return;
	}
	//创建一张单通道的灰度图像
	imageGray = Mat::zeros(image.size(), CV_8UC1);
	//取出存储图像像素的数组的指针
	uchar *pointImage = image.data;
	uchar *pointImageGray = imageGray.data;
	//取出图像每行所占的字节数
	size_t stepImage = image.step;
	size_t stepImageGray = imageGray.step;
	for (int i = 0; i < imageGray.rows; i++)
	{
		for (int j = 0; j < imageGray.cols; j++)
		{
			pointImageGray[i*stepImageGray + j] = (uchar)(0.114*pointImage[i*stepImage + 3 * j] + 0.587*pointImage[i*stepImage + 3 * j + 1] + 0.299*pointImage[i*stepImage + 3 * j + 2]);
		}
	}
}
 
 
//存储梯度膜长
void SobelGradDirction(Mat &imageSource, Mat &imageSobelX, Mat &imageSobelY)
{
	imageSobelX = Mat::zeros(imageSource.size(), CV_32SC1);
	imageSobelY = Mat::zeros(imageSource.size(), CV_32SC1);
	//取出原图和X和Y梯度图的数组的首地址
	uchar *P = imageSource.data;
	uchar *PX = imageSobelX.data;
	uchar *PY = imageSobelY.data;
 
	//取出每行所占据的字节数
	int step = imageSource.step;
	int stepXY = imageSobelX.step;
 
	int index = 0;//梯度方向角的索引
	for (int i = 1; i < imageSource.rows - 1; ++i)
	{
		for (int j = 1; j < imageSource.cols - 1; ++j)
		{
			//通过指针遍历图像上每一个像素   
			double gradY = P[(i + 1)*step + j - 1] + P[(i + 1)*step + j] * 2 + P[(i + 1)*step + j + 1] - P[(i - 1)*step + j - 1] - P[(i - 1)*step + j] * 2 - P[(i - 1)*step + j + 1];
			PY[i*stepXY + j*(stepXY / step)] = abs(gradY);
 
			double gradX = P[(i - 1)*step + j + 1] + P[i*step + j + 1] * 2 + P[(i + 1)*step + j + 1] - P[(i - 1)*step + j - 1] - P[i*step + j - 1] * 2 - P[(i + 1)*step + j - 1];
			PX[i*stepXY + j*(stepXY / step)] = abs(gradX);
		}
	}
	//将梯度数组转换成8位无符号整型
	convertScaleAbs(imageSobelX, imageSobelX);
	convertScaleAbs(imageSobelY, imageSobelY);
}
 
 
void SobelXX(const Mat imageGradX, Mat_<float> &SobelAmpXX)
{
	SobelAmpXX = Mat_<float>(imageGradX.size(), CV_32FC1);
	for (int i = 0; i < SobelAmpXX.rows; i++)
	{
		for (int j = 0; j < SobelAmpXX.cols; j++)
		{
			SobelAmpXX.at<float>(i, j) = imageGradX.at<uchar>(i, j)*imageGradX.at<uchar>(i, j);
		}
	}
	//convertScaleAbs(SobelAmpXX, SobelAmpXX);
}
 
void SobelYY(const Mat imageGradY, Mat_<float> &SobelAmpYY)
{
	SobelAmpYY = Mat_<float>(imageGradY.size(), CV_32FC1);
	for (int i = 0; i < SobelAmpYY.rows; i++)
	{
		for (int j = 0; j < SobelAmpYY.cols; j++)
		{
			SobelAmpYY.at<float>(i, j) = imageGradY.at<uchar>(i, j)*imageGradY.at<uchar>(i, j);
		}
	}
	//convertScaleAbs(SobelAmpYY, SobelAmpYY);
}
 
void SobelXY(const Mat imageGradX, const Mat imageGradY, Mat_<float> &SobelAmpXY)
{
	SobelAmpXY = Mat_<float>(imageGradX.size(), CV_32FC1);
	for (int i = 0; i < SobelAmpXY.rows; i++)
	{
		for (int j = 0; j < SobelAmpXY.cols; j++)
		{
			SobelAmpXY.at<float>(i, j) = imageGradX.at<uchar>(i, j)*imageGradY.at<uchar>(i, j);
		}
	}
	//convertScaleAbs(SobelAmpXY, SobelAmpXY);
}
 
 
 
//计算一维高斯的权值数组
double *getOneGuassionArray(int size, double sigma)
{
	double sum = 0.0;
	//定义高斯核半径
	int kerR = size / 2;
 
	//建立一个size大小的动态一维数组
	double *arr = new double[size];
	for (int i = 0; i < size; i++)
	{
 
		// 高斯函数前的常数可以不用计算,会在归一化的过程中给消去
		arr[i] = exp(-((i - kerR)*(i - kerR)) / (2 * sigma*sigma));
		sum += arr[i];//将所有的值进行相加
 
	}
	//进行归一化	
	for (int i = 0; i < size; i++)
	{
		arr[i] /= sum;
		cout << arr[i] << endl;
	}
	return arr;
}
 
void MyGaussianBlur(Mat_<float> &srcImage, Mat_<float> &dst, int size)
{
	CV_Assert(srcImage.channels() == 1 || srcImage.channels() == 3); // 只处理单通道或者三通道图像
	int kerR = size / 2;
	dst = srcImage.clone();
	int channels = dst.channels();
	double* arr;
	arr = getOneGuassionArray(size, 1);//先求出高斯数组
 
									   //遍历图像 水平方向的卷积
	for (int i = kerR; i < dst.rows - kerR; i++)
	{
		for (int j = kerR; j < dst.cols - kerR; j++)
		{
			float GuassionSum[3] = { 0 };
			//滑窗搜索完成高斯核平滑
			for (int k = -kerR; k <= kerR; k++)
			{
 
				if (channels == 1)//如果只是单通道
				{
					GuassionSum[0] += arr[kerR + k] * dst.at<float>(i, j + k);//行不变,列变换,先做水平方向的卷积
				}
				else if (channels == 3)//如果是三通道的情况
				{
					Vec3f bgr = dst.at<Vec3f>(i, j + k);
					auto a = arr[kerR + k];
					GuassionSum[0] += a*bgr[0];
					GuassionSum[1] += a*bgr[1];
					GuassionSum[2] += a*bgr[2];
				}
			}
			for (int k = 0; k < channels; k++)
			{
				if (GuassionSum[k] < 0)
					GuassionSum[k] = 0;
				else if (GuassionSum[k] > 255)
					GuassionSum[k] = 255;
			}
			if (channels == 1)
				dst.at<float>(i, j) = static_cast<float>(GuassionSum[0]);
			else if (channels == 3)
			{
				Vec3f bgr = { static_cast<float>(GuassionSum[0]), static_cast<float>(GuassionSum[1]), static_cast<float>(GuassionSum[2]) };
				dst.at<Vec3f>(i, j) = bgr;
			}
 
		}
	}
 
	//竖直方向
	for (int i = kerR; i < dst.rows - kerR; i++)
	{
		for (int j = kerR; j < dst.cols - kerR; j++)
		{
			float GuassionSum[3] = { 0 };
			//滑窗搜索完成高斯核平滑
			for (int k = -kerR; k <= kerR; k++)
			{
 
				if (channels == 1)//如果只是单通道
				{
					GuassionSum[0] += arr[kerR + k] * dst.at<float>(i + k, j);//行变,列不换,再做竖直方向的卷积
				}
				else if (channels == 3)//如果是三通道的情况
				{
					Vec3f bgr = dst.at<Vec3f>(i + k, j);
					auto a = arr[kerR + k];
					GuassionSum[0] += a*bgr[0];
					GuassionSum[1] += a*bgr[1];
					GuassionSum[2] += a*bgr[2];
				}
			}
			for (int k = 0; k < channels; k++)
			{
				if (GuassionSum[k] < 0)
					GuassionSum[k] = 0;
				else if (GuassionSum[k] > 255)
					GuassionSum[k] = 255;
			}
			if (channels == 1)
				dst.at<float>(i, j) = static_cast<float>(GuassionSum[0]);
			else if (channels == 3)
			{
				Vec3f bgr = { static_cast<float>(GuassionSum[0]), static_cast<float>(GuassionSum[1]), static_cast<float>(GuassionSum[2]) };
				dst.at<Vec3f>(i, j) = bgr;
			}
 
		}
	}
	delete[] arr;
}
 
void harrisResponse(Mat_<float> &GaussXX, Mat_<float> &GaussYY, Mat_<float> &GaussXY, Mat_<float> &resultData,float k)
{
	//创建一张响应函数输出的矩阵
	resultData = Mat_<float>(GaussXX.size(), CV_32FC1);
	for (int i = 0; i < resultData.rows; i++)
	{
		for (int j = 0; j < resultData.cols; j++)
		{
			float a = GaussXX.at<float>(i, j);
			float b = GaussYY.at<float>(i, j);
			float c = GaussXY.at<float>(i, j);
			resultData.at<float>(i, j) = a*b - c*c - k*(a + b)*(a + b);
		}
	}
}
 
 
//非极大值抑制
void LocalMaxValue(Mat_<float> &resultData, Mat &srcGray, Mat &ResultImage, int kSize)
{
	int r = kSize / 2;
	ResultImage = srcGray.clone();
	for (int i = r; i < ResultImage.rows - r; i++)
	{
		for (int j = r; j < ResultImage.cols - r; j++)
		{
			if (resultData.at<float>(i, j) > resultData.at<float>(i - 1, j - 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i - 1, j) &&
				resultData.at<float>(i, j) > resultData.at<float>(i - 1, j - 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i - 1, j + 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i, j - 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i, j + 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i + 1, j - 1) &&
				resultData.at<float>(i, j) > resultData.at<float>(i + 1, j) &&
				resultData.at<float>(i, j) > resultData.at<float>(i + 1, j + 1))
			{
				if ((int)resultData.at<float>(i, j) > 18000)
				{
					circle(ResultImage, Point(i, j), 5, Scalar(0,0,255), 2, 8, 0);
				}
			}
 
		}
	}
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV检测角点 的相关文章

  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 变形:Opencv 使用 Visual Studio 将图像显示到曲面屏幕

    我正在尝试使用 opencv API 来扭曲图像 以便将其显示到曲面屏幕上 我已经浏览了opencv中提供的翘曲apihere http docs opencv org 2 4 modules stitching doc warpers h
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 从一个 Mat 复制到另一个 Mat 仅接近黑色像素

    I have Mat difference其中有一些黑色像素 或者几乎是黑色像素 gt 如果发生地震 建筑物会移动等 并且Mat current它由具有自然色彩的真实图像组成 我想替换中的像素Mat current这些黑色像素Mat dif
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000
  • OpenCV非旋转图像拼接

    我正在 OpenCV 中进行图像拼接 从不同位置拍摄平面场景的照片并尝试构图全景图 我修改了缝合示例以满足我的需要 openCV 拼接管道的问题是 它假设相机纯粹旋转 但对我来说情况并非如此 当拍摄的照片与场景完全正交时 没有相机旋转 只是
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • 如何计算立体视觉的基本矩阵

    我正在尝试编写一些代码来计算基本矩阵以确定立体图像之间的关系 我从大多数人推荐的 Hartley 和 Zisserman 书开始 但它没有任何实际示例 并且示例代码是在 MATLAB 中 而我没有 然后我切换到这个比较实用 里面有实际例子
  • 如何将图像从 np.uint16 转换为 np.uint8?

    我正在创建一个图像 image np empty shape height width 1 dtype np uint16 之后我将图像转换为 BGR 模型 image cv2 cvtColor image cv2 COLOR GRAY2B
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 将线性数组转换为二维矩阵

    我有一个浮点指针 数组 它代表一个图像 它的元素计数和索引具有宽度 高度 图像不像矩阵 其原点位于左上角 相反 它的原点位于左下角 就像在笛卡尔坐标系中一样 达到最大宽度后 它从左侧开始下一行 所以我想有效地将 这个数组转换为二维矩阵 可选
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • OpenCV 读取视频文件时内存不足

    此示例从文件中读取视频cv2 VideoCapture在 python OpenCV 中内存不足 import cv2 cap cv2 VideoCapture file mp4 while True ret frame cap read
  • Android for OpenCV - 打开跟踪文件时出错,UnsatisfiedLinkError

    我对 Android 开发和 OpenCV 都是新手 我从 Android 下载了 OpenCV 库http sourceforge net projects opencvlibrary files opencv android http
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 使用 pygtk3 将 GUI 窗口添加到 python opencv2 程序

    我已经使用Python和Opencv2完成了一个程序 现在 我想向我的程序添加一个 GUI 窗口 我对 PyGtk3 有一些经验 因此 我修改了代码以采用 PyGtk3 但是 我遇到了错误 因此 我尝试了一个简单的程序来找出实际的错误 我的
  • 如何识别与我的对象相关的轮廓并找到它们的几何质心

    问题陈述和背景信息 EDIT 约束 法兰上的红色会随着时间的推移而变化 所以我此时不会尝试使用颜色识别来识别我的对象 除非它足够强大 此外 外部照明也可能是一个因素 因为将来这将是在室外区域 我有 RGB 深度相机 有了它 我就能捕捉到这个
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查

随机推荐

  • 科技云报道:震惊!4K、8K画质背后,竟然少不了AI的助力

    科技云报道原创 对于视频的画质 我现在最低只能够接受720P 最好是1080p 早五年前 身边就已经有人提出了这样的要求 随着科技的进步 我们进入了一个视频内容快速增长的时代 从社交媒体到在线教育 从直播购物到虚拟会议 视频正逐渐成为主流的
  • Jiu Yuan Wants to Eat【2018焦作网络赛】【树链剖分】

    题目链接 树链剖分学习笔记 可以看这里 这道题还真挺好的 以前不会做 现在想了发现 学过树链剖分之后 剩下的部分就是处理去反那块比较的不容易些了 但是想了一下午 现在还是给我敲出来了 我们主要难处理的就是关于求反 那么怎么处理求反 一开始读
  • antd-select下拉框如何同时获取所选值ID和名字属性

    其中传过去的e为 从antd官网可以看到select组件的onchange属性传参 第一个参数为value 第二个参数可为所选中的那一项的所有信息 其中的props属性内有一个children属性 即存储了所选项的名称
  • JWT快速入门及所需依赖

    目录 1 JWT 1 1什么是JWT 1 2JWT的构成 jwt的头部 payload signature 1 3JWT快速入门案例 2Jwt认证 微服务 2 1微服务下统一权限认证 2 2应用认证 3 无状态的JWT令牌如何实现续签功能
  • 蓝桥杯2022年第十三届省赛真题-最优清零方案--java语言

    题目链接 https www dotcpp com oj problem2689 html 一开始没仔细看题目 以为是自然连续数 搞得我还发了篇提问 怪尴尬的 https ask csdn net questions 7913935 spm
  • MongoDB、Elasticsearch分组统计性能比较

    环境参数 CentOS 7 6 虚拟机 4核 8GB Elasticsearch 5 6 16 MongoDB 5 0 9 数据结构 userId rkyao searchId 6e1c409ed7484a6a8a795e750bef9e2
  • 空间向量及值插值相关函数

    1 两个向量之间插值 float3 slerpBetweenVector float3 from float3 to float delta quatf model start quatf fromDirectedRotation norm
  • 算法分析与设计编程题 回溯法

    装载问题 题目描述 解题代码 递归回溯 goods i 表示货物i的重量 c1 c2分别表示货船1和货船2的载重量 vector
  • 关于项目报错Error:Cannot build Artifact :war exploded because it is included into a circular depency

    报个这个错的意思 你大概在编译项目的时候 你构建项目的时候 你点的是build project 而不是选择rebuild project 导致重复的依赖 这时候找到项目目录中的 idea目录 在进入artifacts文件目录 发现里面有两个
  • siammask_e 安装和使用

    基于siammask e的成绩 验证下demo效果 https paperswithcode com sota visual object tracking on vot2019 p fast visual object tracking
  • 值得拥有的5 款功能强大的免费 PDF 编辑器

    编辑 PDF 文件可能是一个真正的挑战 尤其是当您找不到合适的工具时 此外 如今大多数工具都需要大量订阅 这意味着您必须在口袋里烧一个洞才能对 PDF 文件进行更改 但是等等 这是一个转折点 有一些免费使用的 PDF 编辑器可以帮助您毫无后
  • 微信好友大数据分析

    微信好友数据分析 这里很多工作量 参考了该篇博客 在此致谢 传送门如下 一件有趣的事 我用 Python 爬了爬自己的微信朋友 不过原博客代码不是特别全 有些没有放出来 而且代码都是图片截图 比较模糊 所以我来整理一下我的代码 贴上来 同时
  • 【订阅消息】微信小程序发送服务通知

    前言 由于上次的公众号测试消息推送次数太多被官方认为是推销或者是广告之类的 被微信官方给禁了 然后偶然在一次吃饭的时候扫码点餐下单之后有个弹窗勾选订单完成通知 勾选之后就餐之后就会发送一个服务通知告诉您的订单已完成 其实基于这种消息提醒也是
  • keil5选择ST-Link Debugger时候setting点击不了问题

    分享一个自己用keil5的ST Link Debugger时候遇到的一个问题 就是在我选择用ST Link来进行调试时候 发现setting选择不了 如图所示 弹出来了一个提示我 说无法加载驱动程序 少了一个ST LINKIII KEIL
  • Redis 系列-- SpringBoot中redisTemplate 的操作(一)

    SpringBoot中 集成 redisTemplate 对 Redis 的操作 一 在Java 操作redis 时 有很多工具 redis 官网中 就有很多操作 目前主流开发框架SpringBoot 中 当然也有集成好的操作redis的工
  • 关于浏览器出现ERR_SSL_PROTOCOL_ERROR错误的原因与解决建议

    一 导致ERR SSL PROTOCOL ERROR错误主要有以下几个原因 Invalid System Time 系统时间与网络时间不同步 Firewall blocking the website or IP address Websi
  • 关于yarn安装时报“node“ is incompatible with this module的解决办法

    前提 在用vue写一个h5页面时 当在用yarn安装时 提示如下错误 The engine node is incompatible with this module Expected version 14 18 0 16 14 0 gt
  • Jmeter —— 常用的几种断言方法(基本用法)

    在使用JMeter进行性能测试或者接口自动化测试工作中 经常会用到的一个功能 就是断言 断言相当于检查点 它是用来判断系统返回的响应结果是否正确 以此帮我们判断测试是否通过 本文 主要介绍几种常用的断言 响应断言 JSON断言 BeanSh
  • WPS AI(海外版)使用体验分享

    最近很幸运的通过了WPS AI海外版的内测waitlist 这里和大家分享一下使用的体验和评价 申请与安装 WPS AI分为国内版和海外版两种 其中根据WPS自己的介绍 国内版本的模型由MinMax公司提供 海外版则是直接使用OpenAI的
  • OpenCV检测角点

    harris角点检测算法步骤 1 利用Soble计算出XY方向的梯度值 2 计算出Ix 2 Iy 2 Ix Iy 3 利用高斯函数对Ix 2 Iy 2 Ix Iy进行滤波 4 计算局部特征结果矩阵M的特征值和响应函数C i j Det M