gpt4 book ai didi

c++ - 对角正弦波的扭曲图像

转载 作者:行者123 更新时间:2023-12-02 17:16:37 28 4
gpt4 key购买 nike

我正在尝试使用OpenCV中的sin函数使彩色图像变形,并且我成功地做到了。但是,如何使用正弦波进行“对角线”变形?
我的代码是这样的:

Mat result = src.clone();
for (int i = 0; i < src.rows; i++) { // to y
for (int j = 0; j < src.cols; j++) { // to x
for (int ch = 0; ch < 3; ch++) { // each colour
int offset_x = 0;
int offset_y = (int)(25.0 * sin(3.14 * j / 150));
if (i + offset_y < src.rows) {
result.at<Vec3b>(i, j)[ch] = src.at<Vec3b>((i + offset_y) % src.rows, j)[ch];
}
else
result.at<Vec3b>(i, j)[ch] = 0.0;
}
}
}

imshow("result", result);
我怎样才能做到这一点?不是绘制正弦图,而是使图像变形。
解决了!几次之前,我收到某人的消息,告诉我图像被盗。实际上,它是来自Google的,但为了不造成任何情况,我已将其删除。谢谢!

最佳答案

我认为它应该像这样:

void deform()
{
float alpha = 45 * CV_PI / 180.0; // wave direction
float ox = cos(alpha);
float oy = sin(alpha);

cv::Mat src = cv::imread("F:/ImagesForTest/lena.jpg");

for (int i = 0; i < src.rows; i+=8)
{
cv::line(src, cv::Point(i, 0), cv::Point(i, src.rows),cv::Scalar(255,255,255));
}

for (int j = 0; j < src.cols; j += 8)
{
cv::line(src, cv::Point(0,j), cv::Point(src.cols,j), cv::Scalar(255, 255, 255));
}


cv::Mat result = src.clone();
for (int i = 0; i < src.rows; i++)
{ // to y
for (int j = 0; j < src.cols; j++)
{ // to x
float t =(i * oy)+ (j * ox); // wave parameter
for (int ch = 0; ch < 3; ch++)
{ // each colour
int offset_x =ox* (int)(25.0 * (sin(3.14 * t/ 150)));
int offset_y =oy* (int)(25.0 * (sin(3.14 * t / 150)));
if (i + offset_y < src.rows && j + offset_x < src.rows && i + offset_y >=0 && j + offset_x>=0)
{
result.at<cv::Vec3b>(i, j)[ch] = src.at<cv::Vec3b>(i + offset_y, j + offset_x )[ch];
}
else
result.at<cv::Vec3b>(i, j)[ch] = 0.0;
}
}
}

cv:: imshow("result", result);
cv::imwrite("result.jpg", result);
cv::waitKey();
}
结果:
enter image description here
顺便说一句,使用cv::remap可能更好?

关于c++ - 对角正弦波的扭曲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64498601/

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