gpt4 book ai didi

c++ - 尝试使用 opencv c++ 绘制简单函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:51 24 4
gpt4 key购买 nike

这就是我为方程式生成数据点的方式:

enter image description here

  struct Sine_point {
double x;
double y;
};


Sine_point graph[2000];

for(int i = 0; i < 2000; i++) {
float x = (i - 1000.0) / 100.0;
graph[i].x = x;
graph[i].y = sin(x * 10.0) / (1.0 + x * x);
cout<<graph[i].x<<graph[i].y<<endl;

}

现在我想根据这些点绘制图表。到目前为止我尝试过的是一个绘制直线的程序:

#include <vector>
#include "opencv2/highgui/highgui.hpp"
#include <opencv\cv.h>
#include <iostream>
#include<conio.h>


using namespace cv;
using namespace std;


int main()

{


std::vector<char> dataPtr(40000, 200);
cv::Point p1(0,0);
cv::Point p2(200, 200);
cv::Size size(200,200);
cv::Mat image(size, CV_8U, &(dataPtr[0]));
if (image.empty()) //check whether the image is valid or not
{
cout << "Error : Image cannot be created..!!" << endl;
system("pause"); //wait for a key press
return -1;
}

cv::line(image, p1, p2, 'r', 5, 8, 0);

namedWindow("MyWindow", CV_WINDOW_AUTOSIZE); //create a window with the name "MyWindow"

imshow("MyWindow", image); //display the image which is stored in the 'img' in the "MyWindow" window

waitKey(0); //wait infinite time for a keypress
destroyWindow("MyWindow"); //destroy the window with the name, "MyWindow"
return 0;
}

这使用 cv:line,它连接我提供的端点。但是我该如何处理我的函数数据呢?

更新

这是我现在的做法:

int main()

{

std::vector<char> dataPtr(40000, 200);

cv::Size s(200,200);
cv::Mat image(s, CV_8U, &(dataPtr[0]));

if (image.empty()) //check whether the image is valid or not
{
cout << "Error : Image cannot be created..!!" << endl;
system("pause"); //wait for a key press
return -1;
}

struct Sine_point {
double x;
double y;
};


Sine_point graph[2000];

for(int i = 0; i < 2000; i++) {
float x = (i - 1000.0) / 100.0;
graph[i].x = x;
graph[i].y = sin(x * 10.0) / (1.0 + x * x);

cv::Point p1(graph[i].x,graph[i].y);
cv::Point p2(graph[i+1].x, graph[i+1].y);

cv::line(image, p1, p2, Scalar(0,0,255), 5, 8, 0);
}


namedWindow("MyWindow", CV_WINDOW_AUTOSIZE); //create a window with the name "MyWindow"

imshow("MyWindow", image); //display the image which is stored in the 'img' in the "MyWindow" window

waitKey(0); //wait infinite time for a keypress
destroyWindow("MyWindow"); //destroy the window with the name, "MyWindow"
return 0;
}

但现在我得到的是空白图像。

最佳答案

这是我的解决方案。对您的代码进行了一些更改并添加了缩放比例:

struct Sine_point {
double x;
double y;
};

int main()
{

unsigned int nSamples = 2000;

// use float precision?!?
Sine_point min;
Sine_point max;

Sine_point graph[nSamples];
for(unsigned int i = 0; i < nSamples; i++)
{
//using double precision:

// sample to confirm y-axis mirroring: simple line
//double x = (i - 1000.0) / 100.0;
//double y = x;

double x = (i - 1000.0) / 100.0;
double y = sin(x * 10.0) / (1.0 + x * x);

Sine_point sample; sample.x = x; sample.y = y;

graph[i] = sample;
std::cout<<graph[i].x<<graph[i].y<<std::endl;

if(sample.x < min.x ) min.x = sample.x;
if(sample.y < min.y ) min.y = sample.y;

if(sample.x > max.x ) max.x = sample.x;
if(sample.y > max.y ) max.y = sample.y;

}

cv::Size imageSize(640,480); // your window size
cv::Mat image(imageSize, CV_8UC1);

if (image.empty()) //check whether the image is valid or not
{
std::cout << "Error : Image cannot be created..!!" << std::endl;
system("pause"); //wait for a key press
return -1;
}

//now scale your points to fit inside the image:
Sine_point dataOffset;
// here you could define the offsets by yourself, I just use image borders and scale the values to fit inside the image
dataOffset.x = -min.x;
// we have to mirror the y axis!
dataOffset.y = min.y;

Sine_point dataScale;
dataScale.x = (double)imageSize.width / (max.x - min.x);
// remember to mirror the y axis
dataScale.y = - (double)imageSize.height/ (max.y - min.y);

// scale the samples
for(unsigned int i=0; i<nSamples; ++i)
{
graph[i].x = (graph[i].x + dataOffset.x) * dataScale.x;
graph[i].y = (graph[i].y + dataOffset.y) * dataScale.y;

}

// draw the samples
for(unsigned int i=1; i<nSamples; ++i)
{

cv::Point2f p1; p1.x = graph[i-1].x; p1.y = graph[i-1].y;
cv::Point2f p2; p2.x = graph[i].x; p2.y = graph[i].y;
cv::line(image, p1, p2, 'r', 5, 8, 0);
}

cv::namedWindow("MyWindow", CV_WINDOW_AUTOSIZE); //create a window with the name "MyWindow"

cv::imshow("MyWindow", image); //display the image which is stored in the 'img' in the "MyWindow" window

cv::imwrite("sinusDraw.png", image);

cv::waitKey(0); //wait infinite time for a keypress

return 0;
}

给我这个结果:

enter image description here

关于c++ - 尝试使用 opencv c++ 绘制简单函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com