-
Cursor 官网
-
登录可用,免费版一个月可以提问 100 次。
对话形式,支持所有语言 -
直接问一个任务,能给出任务Demo
如实现图像相似度算法
// 导入OpenCV库
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 读取两张图片
Mat img1 = imread("image1.jpg");
Mat img2 = imread("image2.jpg");
// 将图片转换为灰度图
cvtColor(img1, img1, COLOR_BGR2GRAY);
cvtColor(img2, img2, COLOR_BGR2GRAY);
// 计算直方图
Mat hist1, hist2;
calcHist(&img1, 1, 0, Mat(), hist1, 1, {256}, {0, 256});
calcHist(&img2, 1, 0, Mat(), hist2, 1, {256}, {0, 256});
// 计算相似度
double similarity = compareHist(hist1, hist2, HISTCMP_CORREL);
// 输出相似度
std::cout << "相似度为:" << similarity << std::endl;
return 0;
更多图像匹配算法
matchTemplate(Img1, Img2, result, cv::TM_CCOEFF_NORMED, ROI);
template<typename T>
class ReadWriteLock {
public:
// 读操作
T read() {
std::shared_lock<std::shared_mutex> lock(mutex_);
return (value_);
}
// 写操作
void write(T value) {
std::unique_lock<std::shared_mutex> lock(mutex_);
value_ = value;
}
private:
T value_;
std::shared_mutex mutex_;
};
写一个不确定个数传参Demo
void fun(const double noSim, ...)
{
va_list args;
va_start(args, noSim);
const double Z = va_arg(args, const double);
const cv::Mat rb = va_arg(args, const cv::Mat);
const SimilarityBase::Ptr spSim = va_arg(args, const SimilarityBase::Ptr);
va_end(args);
}
比如实现ArcFace损失函数
import math
import tensorflow as tf
from unittest.mock import MagicMock
def arcface_loss(embeddings, labels, out_num, s=64.0, m=0.5):
cos_m = math.cos(m)
sin_m = math.sin(m)
mm = sin_m * m # issue 1
threshold = math.cos(math.pi - m)
cos_t = tf.matmul(embeddings, tf.transpose(embeddings))
batch_size = tf.shape(embeddings)[0]
labels = tf.reshape(labels, [batch_size, 1])
labels = tf.cast(labels, dtype=tf.int32)
indices = tf.reshape(tf.range(0, batch_size), [batch_size, 1])
indices = tf.cast(indices, dtype=tf.int32)
concated = tf.concat([indices, labels], axis=1)
one_hot = tf.sparse_to_dense(concated, [batch_size, out_num], 1.0, 0.0)
one_hot = tf.cast(one_hot, dtype=tf.float32)
cosine = cos_t * one_hot
sine = tf.sqrt(1.0 - tf.square(cosine))
phi = cos_t * cos_m - sine * sin_m # issue 2
phi = tf.where(cos_t > threshold, phi, cos_t - sin_m * mm)
output = (phi * one_hot + (cosine - phi * one_hot) * s) # issue 3
return output
def test_arcface_loss():
embeddings = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]])
labels = tf.constant([0, 1, 2])
out_num = 3
s = 64.0
m = 0.5
expected_output = tf.constant([[64.0, -32.0, -32.0], [-32.0, 64.0, -32.0], [-32.0, -32.0, 64.0]])
assert tf.reduce_all(tf.equal(arcface_loss(embeddings, labels, out_num, s, m), expected_output))
pip install opencv-contrib-python==4.5.5.64
--index-url https://pypi.tuna.tsinghua.edu.cn/simple
如HSL、HSV 中 S L V的区别
-
HSL颜色空间中的L分量表示颜色的亮度,是从黑色到白色的连续变化
-
HSV颜色空间中的V分量表示颜色的明度,是从黑色到最鲜艳的颜色的连续变化
-
HSV颜色空间中的S分量表示颜色的纯度,是颜色中白色成分的比例
-
HSL颜色空间中的S分量表示颜色的饱和度,是颜色中灰色成分的比例
实现 L分量代码
double calculateL(double r, double g, double b) {
double maxVal = std::max({r, g, b});
double minVal = std::min({r, g, b});
double l = (maxVal + minVal) / 2.0;
return l;
}
C++重写(override)、复写(overwrite)、重载(overload)区别
重写(override)是指派生类中重新定义基类中已有的虚函数,使得派生类对象调用该虚函数时,调用的是派生类中的函数。重写的函数必须与基类中的虚函数有相同的函数名、参数列表和返回类型。在派生类中,可以使用override关键字显式地声明一个函数是重写基类中的虚函数。
复写(overwrite)是指在派生类中定义一个与基类中同名的非虚函数,从而覆盖了基类中的同名函数。复写的函数必须与基类中的函数有相同的函数名和参数列表,但可以有不同的返回类型。复写不需要使用关键字。
重载(overload)是指在同一个作用域中定义多个同名函数,但它们的参数列表不同。重载的函数必须与其他同名函数有不同的参数列表,可以有不同的返回类型。重载不需要使用关键字。