在图像中绘制隐式函数(Python,[OpenCV])
我需要根据图像中的函数绘制一条曲线。类似于x^2+y^2=1的函数,无需将其转换为显式形式,因为并非我使用的所有函数都可以通过这种方式轻松转换。对于常规隐式函数,我使用带有x点和y点的cv2.polyline在图像中绘制曲线,我想从你们那里知道,对于显式函数是否有类似的解决方案。到目前为止,我所发现的一切都是使用matplotlib使用plt.contour绘制图形。但这对我来说似乎没有什么用处。请帮忙在图像中绘制隐式函数(Python,[OpenCV]),python,opencv,image-processing,computer-vision,curve,Python,Opencv,Image Processing,Computer Vision,Curve,我需要根据图像中的函数绘制一条曲线。类似于x^2+y^2=1的函数,无需将其转换为显式形式,因为并非我使用的所有函数都可以通过这种方式轻松转换。对于常规隐式函数,我使用带有x点和y点的cv2.polyline在图像中绘制曲线,我想从你们那里知道,对于显式函数是否有类似的解决方案。到目前为止,我所发现的一切都是使用matplotlib使用plt.contour绘制图形。但这对我来说似乎没有什么用处。请帮忙 谢谢你 你可以这样渲染,对不起,我是C++粉丝)希望Python程序员的想法是清晰的。 //
谢谢你
你可以这样渲染,对不起,我是C++粉丝)希望Python程序员的想法是清晰的。// Your function
float func(float x, float y)
{
// x * x * sin(x) + y * y = 1
return (x * x * sin(x) + y * y - 1);
}
// render it
void plotXY()
{
// canvas size
int height = 800;
int width = 800;
// plot scale
float scale = 0.1;
// cavas
cv::Mat result=cv::Mat::zeros(height, width, CV_8UC3);
// move origin to canvas center
float cx = (float)width / 2.0f;
float cy = (float)height / 2.0f;
// precompute scale
float sx = (scale * (float)width);
float sy = (scale * (float)height);
// scan for zero crossings
for (uint32_t i = 1; i < height-1; ++i)
{
for (uint32_t j = 1; j < width-1; ++j)
{
// transform screen space to real space
float x = ((float)j - cx) / sx;
float x1 = ((float)(j-1) - cx) / sx;
float x2 = ((float)(j+1) - cx) / sx;
float y = ((float)i - cy) / sy;
float y1 = ((float)(i-1) - cy) / sy;
float y2 = ((float)(i+1) - cy) / sy;
// if zero crossimg along x put pixel
if ( func(x1,y)* func(x2, y) < 0)
{
result.at<cv::Vec3b>(i, j) = cv::Vec3b(255, 255, 255);
}
// if zero crossimg along y put pixel
if (func(x, y1) * func(x, y2) < 0)
{
result.at<cv::Vec3b>(i, j) = cv::Vec3b(255, 255, 255);
}
}
}
// show and save result
cv::imshow("plot", result);
cv::imwrite("plot.jpg", result);
cv::waitKey();
}
//您的函数
浮点函数(浮点x,浮点y)
{
//x*x*sin(x)+y*y=1
返回(x*x*sin(x)+y*y-1);
}
//渲染它
void plotXY()
{
//帆布尺寸
内部高度=800;
整数宽度=800;
//绘图比例尺
浮标度=0.1;
//卡瓦斯
cv::Mat结果=cv::Mat::零(高度、宽度、cv_8UC3);
//将原点移到画布中心
浮动cx=(浮动)宽度/2.0f;
浮动cy=(浮动)高度/2.0f;
//计算机前比例尺
浮动sx=(刻度*(浮动)宽度);
浮动sy=(刻度*(浮动)高度);
//扫描零交叉点
对于(uint32_t i=1;i
函数x*x*sin(x)+y*y=1的结果为:
为什么matplotlib pyplot没有用处?似乎是最直接的方式。您还可以迭代x和y并从函数中计算点,然后使用cv2.polylines()在图像或恒定背景上绘制结果。请看,在管道的其余部分,我正在opencv中创建图像,这个函数必须在同一个图像中绘制。所以我想,除非你在每个像素上循环,否则你不可能真正写出图像。谢谢你的回答!我使用类似的实现。似乎我不能没有嵌套的for循环。我想要一个更快的方法,但这个解决方案可以做到。