Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在图像中绘制隐式函数(Python,[OpenCV])_Python_Opencv_Image Processing_Computer Vision_Curve - Fatal编程技术网

在图像中绘制隐式函数(Python,[OpenCV])

在图像中绘制隐式函数(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程序员的想法是清晰的。 //

我需要根据图像中的函数绘制一条曲线。类似于x^2+y^2=1的函数,无需将其转换为显式形式,因为并非我使用的所有函数都可以通过这种方式轻松转换。对于常规隐式函数,我使用带有x点和y点的cv2.polyline在图像中绘制曲线,我想从你们那里知道,对于显式函数是否有类似的解决方案。到目前为止,我所发现的一切都是使用matplotlib使用plt.contour绘制图形。但这对我来说似乎没有什么用处。请帮忙


谢谢你

你可以这样渲染,对不起,我是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循环。我想要一个更快的方法,但这个解决方案可以做到。