首页 > 其他分享 >【OpenCV教程】如何优雅地画出一个几何图形

【OpenCV教程】如何优雅地画出一个几何图形

时间:2024-08-18 20:07:25浏览次数:11  
标签:userdata rotate 几何图形 int 地画 滚动条 OpenCV xuenai winname

@

目录


1.createTrackbar创建滚动条

1.1 API

CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);
  • 参数如下
参数 含义
trackbarname 滚动条名字
winname(window name) 窗体名字。要先用nameWindow创建好同名窗体,滚动条才会出现
value 欲控制的变量的地址
count 欲控制的变量的最大值(最小为0)
onChange 回调函数,默认为空。如果想要传入,那么其参数是固定的
userdata 万能指针,默认为空。如果想要传入,通常用一个类的对象的地址。作为可使用的数据库,用来给回调函数提供变量支持
void onChange(int,void*);

2.getTrackbarPos获得滚动条当前的值

CV_EXPORTS_W int getTrackbarPos(const String& trackbarname, const String& winname);
  • 参数如下
参数 含义
trackbarname 滚动条名字
winname(window name) 窗体名字

3.使用方式一(recommended)

3.1 原理

不使用createTrackbar函数的参数value、onChange、userdata参数。通过while(1)的无限循环,在循环中不断地用getTrackbarPos函数动态地获取滚动条的值,然后在循环内部用这些值进行操作。

3.2 效果

Mat xuenai = imread("xuenai.jpg");
imshow("xuenai",xuenai);

namedWindow("xuenai_rotate");
Mat xuenai_rotate(xuenai.size(), xuenai.type());
createTrackbar("angle","xuenai_rotate", nullptr,360);
while (1) {
    int angle= getTrackbarPos("angle","xuenai_rotate");
    Mat M = getRotationMatrix2D(Point2f(xuenai.cols / 2, xuenai.rows / 2), angle, 1);
    warpAffine(xuenai, xuenai_rotate, M, xuenai.size());
    imshow("xuenai_rotate",xuenai_rotate);
    waitKey(20);
}

4.使用方式二

4.1 原理

不使用getTrackbarPos函数,使用createTrackbar的全部参数,在onChange回调函数中完成所有操作,由于回调函数的参数表是固定的,因此需要userdata传入所需数据。在每次移动滚动条时,相当于调用了一次回调函数,就完成了操作。结尾没有waitKey(0)就显示不了多久。

4.2 效果

class TrackbarUserdata{
public:
    Mat input;
    Mat output;
    int angle=0;
    string winname;
};

void RotateonChange(int,void *userdata) {

    TrackbarUserdata *data = (TrackbarUserdata *) userdata;
    int rows = data->input.rows;
    int cols = data->output.cols;
    Mat M = getRotationMatrix2D(Point2f(rows / 2, cols / 2), data->angle, 1);
    warpAffine(data->input,data->output,M,data->input.size());
    imshow(data->winname,data->output);
    waitKey(10);

}
int main(){
    Mat xuenai = imread("xuenai.jpg");
    imshow("xuenai",xuenai);

    Mat xuenai_rotate(xuenai.size(), xuenai.type());
  
    TrackbarUserdata userdata;
    userdata.input=xuenai;
    userdata.output=xuenai_rotate;
    userdata.winname="xuenai_rotate";
    namedWindow(userdata.winname);
    createTrackbar("angle",userdata.winname, &userdata.angle,360, RotateonChange,&userdata);
    waitKey();
  
    return 0;
}

本文由博客一文多发平台 OpenWrite 发布!

标签:userdata,rotate,几何图形,int,地画,滚动条,OpenCV,xuenai,winname
From: https://www.cnblogs.com/UnderTurrets/p/18365990

相关文章

  • 【OpenCV教程】OpenCV中的数据类型
    @目录1.CV_8U2.CV_8S3.CV_16U4.CV_16S5.CV_16F6.CV_32S7.CV_32F8.CV_64F9.一图流1.CV_8UCV_8U:占8位的unsignedCV_8UC(n):占8位的unsignedcharCV_8UC1:占8位的unsignedchar一通道CV_8UC2:占8位的unsignedchar二通道CV_8UC3:占8位的unsignedchar三通道CV_8UC4:占8位......
  • OpenCV(logPolar()、Point2f())
    目录1.cv::logPolar()函数原型:参数说明:用途和示例:2.cv::Point2f类定义:属性:主要构造函数:用途和示例:总结:1.cv::logPolar()cv::logPolar()是OpenCV中用于进行对数极坐标变换(Log-PolarTransformation)的函数。对数极坐标变换将图像的空间坐标转换为极坐标,并对径向分量取对数......
  • OpenCV(cv::VideoWriter::release())
    目录1.函数定义2.使用示例3.关键点总结cv::VideoWriter::release()是OpenCV中cv::VideoWriter类的一个成员函数,用于释放与视频文件或流相关联的资源。它确保视频写入完成并且释放了用于写入视频的所有内部资源。使用该函数是一个良好的习惯,它可以避免文件被锁定或资源泄......
  • 【全网独家】OpenCV C++ 图像处理实战 :多二维码识别(代码+测试部署)
    介绍在现代社会,二维码无处不在,从支付、物流到用户身份验证,二维码的应用极其广泛。本文将详细介绍如何使用OpenCV在C++环境下实现多二维码识别。我们将涵盖其应用场景、原理解释、算法流程图以及实际代码实现。应用使用场景仓储物流管理:快速扫描多个包裹上的二维码,实现高......
  • OpenCV 高斯模糊
    高斯分布:高斯模糊的原理一:图像产生高斯噪声循环代码实现(耗时)defclamp(pv):#使我们的随机值在0-255之间ifpv>255:return255ifpv<0:return0returnpvimportcv2ascvimportnumpyasnpdefgaussian_noise(image):......
  • OpenCV 模糊操作
    模糊操作三种模糊操作方式均值模糊中值模糊自定义模糊(可以实现上面两种模糊方式)原理:图像处理:基础(模板、卷积运算)图像处理-模板、卷积的整理基于离散卷积定义好每个卷积核不同卷积核得到不同的卷积效果模糊是卷积的一种表象一:均值模糊blurdefblur_demo(imag......
  • OpenCV 图像直方图
    一:直方图的直接使用frommatplotlibimportpyplotaspltdefplot_demo(image):print(image.ravel())plt.hist(image.ravel(),256,[0,256])#ravel将图像3维转一维数组,便于统计频率#统计为256个bin,显示0-256bin,意思是全部显示,我们可以设置只显示一部分plt.show()......
  • OpenCV 边缘保留滤波EPF
    OpenCV经典的两种实现EPF方法:高斯双边和均值迁移一:双边模糊差异越大,越会完整保留defbi_demo(image):dst=cv.bilateralFilter(image,0,100,15)#第二个参数d是distinct,我们若是输入了d,会根据其去算第3或4个参数,我们最好是使用第3或4个参数反算d,先设为0cv......
  • 一个简单的Rtmp推流客户端(QT录音,OpenCV摄像,FFmpeg编码推流)
            RTMP(Real-TimeMessagingProtocol)是一种实时流媒体传输协议,常用于音视频直播。        RTMP推流客户端是一种能够将音视频数据推送到直播服务器的工具。QT录音是利用Qt库实现的录音功能。OpenCV摄像是利用OpenCV库实现的对摄像头的控制和图像处理功......
  • 【OpenCV教程】对图像的各种常用操作
    @目录1.图片读取2.创建窗口3.图片显示4.图片保存5.视频输入输出5.1filename5.2index5.3fourcc5.4apiPreference(notimportant)5.5演示6.通道分离与合并6.1分离API(一)API(二)6.2合并API(一)API(二)7.图片色彩模式转换7.1API7.2转换类型和转换码8.改变图片的对比度和亮度8.1概述8......