当前位置: 首页 > news >正文

有什么做网站优化公司暗网做网站

有什么做网站优化公司,暗网做网站,广州市建设厅官方网站,国际新闻 军事前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 调试方法可参见前文. 一. 这个程序还是有点难度的, 关键点在于: 创建了遮罩. 直接调用一个函数, 还是很简单的.窗口事件处理. 注册窗口回调函数, 用以处理鼠标事件进程同步和互斥锁. 为… 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 调试方法可参见前文. 一. 这个程序还是有点难度的, 关键点在于: 创建了遮罩. 直接调用一个函数, 还是很简单的.窗口事件处理. 注册窗口回调函数, 用以处理鼠标事件进程同步和互斥锁. 为什么会是多进程? 一个是系统进程产生鼠标事件和数据, 另一个是本程序进程处理鼠标事件产生的数据. 这里的数据是同一个变量, 所以需要进程同步与互斥状态机方式处理程序的流转. 二. 程序中的技巧: 常用的多变量集体定义和集体赋值方式: let [src, mut next_frame, mut mask, mut final_img]: [Mat; 4]; //集体定义 let (mouse_event_data, should_handle_mouse_event) (Arc::new(Mutex::new(mouse_event_data)), Arc::new(AtomicBool::new(false))); //集体赋值原程序中: highgui::named_window(SOURCE_WINDOW, highgui::WINDOW_AUTOSIZE)?; 窗口标志必须加上|highgui::WINDOW_GUI_NORMAL, 不然鼠标右键会引起混乱. 三. 重点程序逻辑: 注册窗口回调函数highgui::set_mouse_callback(SOURCE_WINDOW, Some(Box::new(mouse_event_dispatcher)))后, 如果在SOURCE_WINDOW窗口内发生鼠标事件, 操作系统会将此事件分发给mouse_event_dispatcher函数处理. 调用这个函数会需要四个参数,即(event: i32, x: i32, y: i32, flags: i32), 这是由操作系统根据实际情况提供.mouse_event_dispatcher函数几乎原封不动地传给mouse_event_data, 并将should_handle_mouse_event标志置true, 等待程序来处理.主程序就是一个大循环loop{}. 里面首先就是查询上面的should_handle_mouse_event标志是否为true, 如果不是就进入下一循环, 如果为 true 就去获取*mouse_event_data的值, 并赋给 (mouse_event, x, y, _).接下来就是根据当前状态和鼠标事件更新绘图状态 drawing_state state_transform(drawing_state, mouse_event);,然后进入状态机的状态流转. 下面附上作了中文注释的原代码: //! # 本程序演示如何创建遮罩和如何处理鼠标事件 //! Reference: [opencv/samples/cpp/create_mask.cpp](https://github.com/opencv/opencv/blob/4.9.0/samples/cpp/create_mask.cpp)use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; use std::{env, process};use opencv::core::{bitwise_and, find_file, CommandLineParser, Point, Scalar, Vec3b}; use opencv::highgui::imshow; use opencv::imgcodecs::{imread, IMREAD_COLOR}; use opencv::prelude::*; use opencv::{highgui, imgproc, not_opencv_branch_4, opencv_branch_4, Result};// 根据OpenCV版本选择正确的宏 opencv_branch_4! {use opencv::imgproc::LINE_8; } not_opencv_branch_4! {use opencv::core::LINE_8; }const SOURCE_WINDOW: str Source image;// 源图像窗口名称常量 // 绘图状态枚举 #[derive(Debug)] enum DrawingState {Init, // 初始状态DrawingMarkerPoint, // 绘制标记点DrawingMarkerPointFinished, // 标记点绘制完成DrawingMask, // 绘制遮罩DrawingMaskFinished, // 遮罩绘制完成Resetting, // 重置 }fn main() - Result() {// 获取命令行参数let args: VecString env::args().collect();let argv args.iter().map(|s| s.as_str()).collect::Vecstr();// 创建命令行解析器let mut parser CommandLineParser::new(argv, {input | lena.jpg | input image})?;//设置程序的 about 信息parser.about(This program demonstrates using mouse events\n)?;//打印程序的 about 信息parser.print_message()?;println!(\n\tleft mouse button - set a point to create mask shape\n\\tright mouse button - create mask from points\n\\tmiddle mouse button - reset);//获取输入图像路径let input_image argv.into_iter().nth(2).unwrap_or(./examples/data/1.jpg); //lena.jpg); //校验文件是否存在let input_image_path find_file(input_image, true, false).map(|path| {println!(find input_image {} in : {}, input_image, path);path}).unwrap_or_else(|_| panic!(Cannot find input_image: {}, input_image));// 初始化图像变量let [src, mut next_frame, mut mask, mut final_img]: [Mat; 4];//读取图片文件src imread(input_image_path, IMREAD_COLOR)?; if src.empty() {eprintln!(Error opening image: {}, input_image);process::exit(-1);}// 创建源图像窗口// 必须加上 highgui::WINDOW_GUI_NORMAL 去除右键菜单,否则鼠标右键会引起混乱highgui::named_window(SOURCE_WINDOW, highgui::WINDOW_AUTOSIZE|highgui::WINDOW_GUI_NORMAL)?;// 初始化鼠标事件数据let mouse_event_data (highgui::MouseEventTypes::EVENT_MOUSEWHEEL, 0, 0, 0);// 创建用于同步的原子布尔和互斥锁//移动鼠标和本程序都会处理鼠标事件,所以需要互斥锁let (mouse_event_data, should_handle_mouse_event) (Arc::new(Mutex::new(mouse_event_data)), Arc::new(AtomicBool::new(false)));// 创建鼠标事件分发器. 定义了一个闭包函数mouse_event_dispatcher, 接受四个参数:event: i32, x: i32, y: i32, flags: i32let mouse_event_dispatcher {let mouse_data Arc::clone(mouse_event_data);let should_handle_mouse_event Arc::clone(should_handle_mouse_event);move |event: i32, x: i32, y: i32, flags: i32| { //注意:这里的四个参数其实是mouse_event_dispatcher需要调用的参数// can intercept specific mouse events here to dont update the mouse_data//尝试将 event 转换成 highgui::MouseEventTypes 枚举if let Ok(mouse_event) highgui::MouseEventTypes::try_from(event) {//尝试获取 mouse_data 的互斥锁if let Ok(mut mouse_data) mouse_data.lock() {*mouse_data (mouse_event, x, y, flags);}}should_handle_mouse_event.store(true, Ordering::Relaxed);}};// 设置鼠标回调函数. 将鼠标事件绑定到窗口highgui::set_mouse_callback(SOURCE_WINDOW, Some(Box::new(mouse_event_dispatcher))).expect(Cannot set mouse callback);//显示最初图片imshow(SOURCE_WINDOW, src)?;//初始化标记点和绘图状态 let (mut marker_points, mut drawing_state) (Vec::Point::new(), DrawingState::Init);// 创建一个与源图像大小相同的黑色图像next_frame Mat::zeros_size(src.size()?, Vec3b::opencv_type())?.to_mat()?;// 主事件循环loop {// Press Esc to exit 如果按下Esc键则退出循环if highgui::wait_key(10)? 27 {break Ok(());}// 获取并处理鼠标事件//let (mouse_event, x, y, _) { //这一段只是根据取到的mouse_event_data值赋给 (mouse_event, x, y, _)if !should_handle_mouse_event.load(Ordering::Relaxed) {continue; // 如果没有鼠标事件需要处理则继续下一次循环} else {should_handle_mouse_event.store(false, Ordering::Relaxed);// 重置鼠标事件处理标志//下面这句将新变量mouse_event_data绑定到锁上, 并通过解引用获取到值, 并将值赋给了最初的(mouse_event, x, y, _)if let Ok(mouse_event_data) mouse_event_data.lock() {*mouse_event_data // 获取鼠标事件数据 } else {continue; // 如果无法获取鼠标事件数据则继续下一次循环}}};// 根据当前状态和鼠标事件更新绘图状态drawing_state state_transform(drawing_state, mouse_event);// 根据绘图状态执行不同的操作match drawing_state {DrawingState::Init | DrawingState::DrawingMarkerPointFinished { /* do nothing */ }DrawingState::DrawingMarkerPoint {// 如果标记点列表为空则复制源图像到下一帧if marker_points.is_empty() {next_frame src.clone();}// 创建一个新的标记点并添加到列表中let point Point::new(x, y);imgproc::circle(mut next_frame, point, 2, Scalar::new(0., 0., 255., 0.), -1, LINE_8, 0)?;marker_points.push(point);// 如果标记点列表中有两个以上的点则绘制线段if marker_points.len() 1 {imgproc::line(mut next_frame,marker_points[marker_points.len() - 2],point,Scalar::new(0., 0., 255., 0.),2,LINE_8,0,)?;}// 显示下一帧图像imshow(SOURCE_WINDOW, next_frame)?;}DrawingState::DrawingMask {// 如果标记点列表不为空则复制源图像到下一帧并绘制多边形if !marker_points.is_empty() {next_frame src.clone();imgproc::polylines(mut next_frame,Mat::from_slice(marker_points.as_slice())?,true,Scalar::new(0., 0., 0., 0.),2,LINE_8,0,)?;// 显示下一帧图像imshow(SOURCE_WINDOW, next_frame)?;}}DrawingState::DrawingMaskFinished {// 如果标记点列表不为空则创建遮罩和最终图像if !marker_points.is_empty() {final_img Mat::zeros_size(src.size()?, Vec3b::opencv_type())?.to_mat()?;mask Mat::zeros_size(src.size()?, u8::opencv_type())?.to_mat()?;imgproc::fill_poly_def(mut mask, Mat::from_slice(marker_points.as_slice())?, Scalar::all(255.))?;bitwise_and(src, src, mut final_img, mask)?;// 使用遮罩对源图像进行位运算imshow(Mask, mask)?; // 显示遮罩图像imshow(Result, final_img)?; // 显示最终图像imshow(SOURCE_WINDOW, next_frame)?; // 显示下一帧图像}}DrawingState::Resetting {// 如果标记点列表不为空则清空列表并复制源图像到下一帧if !marker_points.is_empty() {marker_points.clear();next_frame src.clone();// 显示下一帧图像imshow(SOURCE_WINDOW, next_frame)?;}}}} }fn state_transform(drawing_state: DrawingState, mouse_event: highgui::MouseEventTypes) - DrawingState {use opencv::highgui::MouseEventTypes::*;use self::DrawingState::*;// 使用 match 表达式来根据当前绘图状态和鼠标事件类型进行模式匹配match (drawing_state, mouse_event) {// 如果当前状态是 Init 并且发生的事件是鼠标左键按下则转换为 DrawingMarkerPoint 状态(Init, EVENT_LBUTTONDOWN) DrawingMarkerPoint,// 如果当前状态是 DrawingMarkerPoint 并且发生的事件是鼠标左键释放则转换为 DrawingMarkerPointFinished 状态(DrawingMarkerPoint, EVENT_LBUTTONUP) DrawingMarkerPointFinished,// 如果当前状态是 DrawingMarkerPointFinished 并且发生的事件是鼠标左键按下则转换回 DrawingMarkerPoint 状态(DrawingMarkerPointFinished, EVENT_LBUTTONDOWN) DrawingMarkerPoint,// 如果当前状态是 DrawingMarkerPointFinished 并且发生的事件是鼠标右键按下则转换为 DrawingMask 状态(DrawingMarkerPointFinished, EVENT_RBUTTONDOWN) DrawingMask,// 如果当前状态是 DrawingMask 并且发生的事件是鼠标右键释放则转换为 DrawingMaskFinished 状态(DrawingMask, EVENT_RBUTTONUP) DrawingMaskFinished,// 如果当前状态是 Init、DrawingMarkerPointFinished 或 DrawingMaskFinished 并且发生的事件是鼠标中键按下则转换为 Resetting 状态(Init | DrawingMarkerPointFinished | DrawingMaskFinished, EVENT_MBUTTONDOWN) Resetting,// 如果当前状态是 Resetting 并且发生的事件是鼠标中键释放则转换为 Init 状态(Resetting, EVENT_MBUTTONUP) Init,// 如果没有匹配到任何上述情况则打印一条错误信息并返回当前的绘图状态_ {println!(Invalid state transition from {:?} with event {:?},drawing_state, mouse_event);drawing_state // 返回当前状态不变}} }
http://www.dnsts.com.cn/news/122804.html

相关文章:

  • 南京网站建设咨询发布工程信息的网站有哪些
  • 做试管的网站404网站怎么做
  • 天津河西做网站哪家好怎样自己制作网站做情感顾问
  • 单纯python能完成网站开发吗策划公司怎么找客户
  • 建设网站重庆人人网
  • 营销网站建立公司网站建设zrhskj
  • 装修网站建设公司江宁外贸网站建设
  • 百度网盟有哪些网站怎样注册小程序店铺
  • 网站初始开发的步骤有没有做维修的网站
  • 桂林工程建设信息网站如何建设网站?
  • 网站前后台天津公司网站制作
  • 大庆百度做网站多少钱seo搜索引擎优化主要做什么
  • 网站分页导航一起做陶瓷的网站
  • 设计好的建设专业网站公司微信网站开发
  • 如何建立一个企业的网站wordpress媒体模板
  • 网站建设所需域名wordpress插件 数据列表
  • 做网站要属于无形资产吗customizr wordpress
  • 关键词挖掘工具爱站网网页出现网站维护
  • 提高网站浏览量网站建设与管理实践收获怎么写
  • 网站如何建立品牌形象化妆品网站网页设计
  • 专业3合1网站建设做百度网站排
  • 创建网站需要哪些过程东莞网站制作找哪里
  • 做电影网站危险吗上海十大网站建设
  • 如何推广我的网站电子商务就业前景和就业方向
  • 长沙做网站推荐杭州二建建设有限公司网站
  • 网站建设需要注意那些点亚马逊网站联盟
  • 校园网站建设可行性分析建设电动车官网
  • 嘉兴网站建设方案h5表单制作
  • 那个网站可以免费做风面游戏软件开发公司排名
  • 网站建设价值中国工程网亿美