精华内容
下载资源
问答
  • 2.环境:vue+数据从父组jian件传进(TimeIntervalNumberData) <template> <div> <div id="chart-temperature-timeintervalnumber" style="width: 200px;height:30px;"></...

    1.为了动态渲染ECharts的图形

    2.环境:vue+数据从父组jian件传进(TimeIntervalNumberData)

    <template>
        <div>
            <div id="chart-temperature-timeintervalnumber" style="width: 200px;height:30px;"></div>
        </div>
    </template>

    <script>
        //体温时段图

        export default {
            props: ['TimeIntervalNumberData'],
            components: {

            },
            data() {
                return {
                    ChartTimeintervalnumber: null,
                }
            },
            mounted: function() {


                var that = this;
                that.ChartTimeintervalnumber = that.$echarts.init(document.getElementById('chart-temperature-timeintervalnumber'))
                that.SetChartsData();
                
            },
            watch: {
                TimeIntervalNumberData: {
                    handler(newVal, oldVal) {
                        //console.log("更新数据")
                        this.SetChartsData()
                    },
                    deep: true
                }

            },
            beforeCreate() {

            },
            beforeUpdate() {


            },
            beforeMount() {

            },

            methods: {
                SetChartsData() {
                    this.ChartTimeintervalnumber.setOption({
                        color: ["#abb8ce"],
                        tooltip: {
                            trigger: 'axis',
                            position: function(pt) {
                                return [pt[0], '10%'];
                            }
                        },
                        grid: {
                            top: '8%',
                            left: '1%',
                            right: '1%',
                            bottom: '8%',
                            containLabel: true,
                        },
                        xAxis: [{

                            axisLabel: {
                                show: false,
                                color: '#abb8ce',
                            },
                            axisTick: { //y轴刻度线
                                show: false
                            },
                            axisLine: { //y轴
                                show: false
                            },
                            data: this.TimeIntervalNumberData.xAxisData, //['1时', '2时', '3时', '4时', '5时', '6时', '7时', '8时', '9时', '10时', '11时', '12时'],
                        }],
                        yAxis: [{
                            axisLabel: {
                                show: false,
                                color: '#abb8ce',
                            },
                            axisTick: { //y轴刻度线
                                show: false
                            },
                            axisLine: { //y轴
                                show: false
                            },
                            splitLine: {
                                show: false
                            }, //去除网格线

                        }],
                        series: [{
                            name: '次数',
                            type: 'line',
                            smooth: true, //是否平滑曲线显示
                            //             symbol:'circle',  // 默认是空心圆(中间是白色的),改成实心圆
                            symbolSize: 0,

                            lineStyle: {
                                normal: {
                                    color: "rgba(61,234,255, 0)" // 线条颜色
                                }
                            },
                            areaStyle: { //区域填充样式
                                normal: {
                                    //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。
                                    color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                            offset: 0,
                                            color: 'rgba(61,234,255, 0.9)'
                                        },
                                        {
                                            offset: 1,
                                            color: 'rgba(61,234,255, 0)'
                                        }
                                    ], false),

                                    shadowColor: 'rgba(53,142,215, 0.9)', //阴影颜色
                                    shadowBlur: 5 //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。
                                }
                            },
                            data: this.TimeIntervalNumberData.SeriesData, // [105, 105, 52, 103, 33, 103, 200]
                        }]
                    }, true);
                },
            }
        }
    </script>

    <style>
    </style>

     

    3.图片

    展开全文
  • Watch与 iPhone的通信、WatchConnectivity通信框架、数据共享

    WatchOS 开发教程系列文章:
    WatchOS开发教程之一: Watch App架构及生命周期
    WatchOS开发教程之二: 布局适配和系统Icon设计尺寸
    WatchOS开发教程之三: 导航方式和控件详解
    WatchOS开发教程之四: Watch与 iPhone的通信和数据共享
    WatchOS开发教程之五: 通知功能开发
    WatchOS开发教程之六: 表盘功能开发


    Apple Watch与iPhone之间的通信

    在第一篇文章Watch App架构及生命周期的最后, 我们提到过: 避免长时间运行的任务。由于与 Watch App的交互通常很简短, 因此在长时间运行的任务完成之前, 可能会暂停 WatchKit Extension。 执行任何长时间运行任务的最佳解决方案是在 iOS App中执行该任务, 然后将数据传输给 Apple Watch。

    所以, 今天来说一说Apple Watch与iPhone之间的通信是如何实现的。

    WatchConnectivity框架

    在 WatchOS中有个WatchConnectivity框架, 是专门负责 WatchOS与 iOS之间的通信的。使用Connectivity框架在 WatchKit Extension和 iOS App之间进行通信。该框架提供了两个进程之间的双向通信,并允许在前台或后台进行数据和文件的传输。

    Connectivity框架提供了几种在 iOS 和 WatchKit Extension之间发送数据的选项, 每个选项都用于不同的用途。大多数选项在后台执行单向数据传输,而且是提供更新的便捷方式。前台传输让你的应用立即发送消息并等待回复。

    对于大多数类型的传输,您提供一个NSDictionary包含要发送的数据的对象。字典的键和值必须都是属性列表类型,因为数据必须序列化并以无线方式发送。属性列表类型是指Foundation框架中的NSNumbeNSStringNSArrayNSDictionaryBoolNSDateNSData等数据类型。如果需要包含非属性列表类型的类型,请将它们打包到NSData对象中,或者在发送之前将它们写入文件。此外,您发送的词典应该是紧凑的,并且只包含您需要的数据。保持字典较小可确保它们快速传输,并且不会在两台设备上消耗太多电量。

    WCSession

    WatchConnectivity框架中主要是通过WCSession类进行数据传输的。来看下WCSession这个类, 它有一个default单例。default session用于在两个对应应用程序(即 iOS App及 WatchKit Extension)之间进行通信。Session提供了发送,接收和跟踪状态的方法。

    您的 iOS App和 WatchOS App必须在执行期间的某个时刻创建和配置此类的实例。当两个会话对象都处于激活状态时,这两个进程可以通过发送消息立即进行通信。当只有一个Session处于激活状态时,Session仍可以发送更新和传输文件,但这些传输在后台机会性地发生。

    Session的配置和激活

    在尝试发送消息或获取有关连接状态的信息之前,必须配置并激活Session。 在激活Session之前,可需要先进行一个检查当前 iOS设备是否支持Connectivity框架, 方法就是调用isSupported()方法。

    在 iOS App中检查是否支持Connectivity框架并激活Session的代码如下:

    func configureWCSession() {
        if #available(iOS 9.0, *) {
            // Some properties can be checked only for iOS Device
            // WCSession.default.isPaired
            // WCSession.default.isWatchAppInstalled
            // WCSession.default.isComplicationEnabled
            if WCSession.isSupported() {
                let session = WCSession.default
                session.delegate = self
                session.activate()
            } else {
                // Current iOS device dot not support session
            }
        } else {
            // The version of system is not available
        }
    }
    

    WCSession类中, 还有一些属性是只能在 iOS App中使用的。比如, isPaired, isWatchAppInstalled, isComplicationEnabled, remainingComplicationUserInfoTransfers, watchDirectoryURL。这些都是仅仅在 iOS App中可用的, 都是标示当前设备的某些状态的。所以, 我们要在通信前利用好这些属性。

    在激活WatchKit Extension的Session前, 不必检查是否支持Connectivity框架, 因为 WatchOS一定支持Connectivity框架。所以, 在 WatchKit Extension中Session的配置和激活就相对简单一些:

    func configureWCSession() {
        // Don't need to check isSupport state, because session is always available on WatchOS
        // if WCSession.isSupported() {}
        let session = WCSession.default
        session.delegate = self
        session.activate()
    }
    

    选择合适的通信方式

    WatchKit Extension与 iPhone间的通信方式有很多种, 可以分为前台实时传输和后台不定时传输两大传输类型。前台传输, 是实时传输, 消息字典传输和消息数据传输。后台传输又分为覆盖式传输, 队列式传输。队列式传输又分为字典传输, 文件传输, 表盘数据传输。一张图把这一切说清楚:

    后台传输

    后台传输是异步执行的, 当发送方的应用退出时,后台传输将会继续。对应的接收方应用不需要运行也可以继续进行后台传输。并且在 WatchKit Extension与 iPhone进行传输的方法中, 所有的后台传输都是不定时传输。不定时意味着, 数据不一定会立即传输, 而是系统将在适当的时间传输内容。当然包括上面所说的在应用程序退出之后发生, 甚至是在双方应用都不运行时发生。接收方没有运行但传输成功了, 下次启动时将会触发相应的代理方法。

    后台覆盖式传输

    后台传输中覆盖式的传输意味着, 当你进行数据传输时, 如果第一次发送的数据还没有送出去, 在此时进行第二次数据传递, 将会覆盖第一次的数据。这时数据接收方接收的数据只会有第二次的, 第一次的数据会丢失。

    Connectivity框架的通信方法中, 后台覆盖式传输只有一个方法, 在 Objective-C中就是updateApplicationContext:error:方法, 在 Swift中函数如下:

    open func updateApplicationContext(_ applicationContext: [String : Any]) throws
    

    一般使用该方法将最近的状态信息传递给对方, 且只有在Session处于激活状态时才能调用此方法, 系统将会在适当的时间传输内容。使用此方法传输后, 发送的数据会存储在applicationContext属性中, 而最新接收的数据会存储在receivedApplicationContext属性中。

    接收方可以遵从 WCSessionDelegate的协议, 在这些代理方法中, 有一个是与上面的方法成对存在的。接收方若实现了下面的代理方法, 当数据发送方在调用上面的方法后, 将会触发它们:

    optional public func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any])
    

    后台队列式传输

    后台传输中队列式的传输意味着, 后一次的传输不会覆盖前一次所传输的数据。系统会把所有的数据按照次序进行发送。在Connectivity框架的通信方法中, 后台队列式有三个方法, 后台队列式字典传输, 后台队列式文件传输, 后台队列式表盘数据传输。

    后台队列式字典传输

    在 Objective-C中后台队列式字典传输的方法是transferUserInfo:, 在 Swift中函数如下:

    open func transferUserInfo(_ userInfo: [String : Any] = [:]) -> WCSessionUserInfoTransfer
    

    此方法可以传输一个字典, 且只有在Session处于激活状态时才能调用此方法。系统将userInfo字典按序排入队列, 并在适当的时候将其传输到接收方应用中。你还可以通过outstandingUserInfoTransfers属性来获取仍在传输中(即未被接收方取消, 失败或已接收)的userInfo数组。

    接收方可以遵从 WCSessionDelegate的协议, 在这些代理方法中, 有两个是与上面的方法成对存在的。接收方若实现了下面的代理方法, 当数据发送方在调用上面的方法后, 将会触发它们:

    optional public func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:])
    
    optional public func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?)
    

    后台队列式文件传输

    在 Objective-C中后台队列式文件传输的方法是transferFile:metadata:, 在 Swift中函数如下:

    open func transferFile(_ file: URL, metadata: [String : Any]?) -> WCSessionFileTransfer
    

    此方法可以传输一个文件和一个可选字典, 且只有在Session处于激活状态时才能调用此方法。你还可以通过outstandingFileTransfers属性来获取仍在传输中(即未被接收方取消, 失败或已接收)的userInfo数组。

    接收方可以遵从 WCSessionDelegate的协议, 在这些代理方法中, 有两个是与上面的方法成对存在的。接收方若实现了下面的代理方法, 当数据发送方在调用上面的方法后, 将会触发它们:

    optional public func session(_ session: WCSession, didReceive file: WCSessionFile)
    
    optional public func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?)
    

    这里需要注意的是, 接收到的文件存放在本地临时路径Documents/Inbox/中, 代理方法session(_ session: WCSession, didReceive file: WCSessionFile)结束后系统会将文件删除。所以你需要接收到文件后, 立即对其进行读取或者移动。

    后台队列式表盘数据传输

    在 Objective-C中后台队列式表盘数据传输的方法是transferCurrentComplicationUserInfo:, 在 Swift中函数如下:

    open func transferCurrentComplicationUserInfo(_ userInfo: [String : Any] = [:]) -> WCSessionUserInfoTransfer
    

    此方法涉及到 WatchOS的表盘功能也就是Complication功能, 且只适用于 iPhone向 WatchKit Extension发送表盘功能相关的数据。此方法将包含表盘功能的最新信息的字典userInfo排入队列中。并且只有在Session处于激活状态时才能调用此方法。

    与之相关的属性有remainingComplicationUserInfoTransfers, 它标示这transferCurrentComplicationUserInfo:方法的剩余调用次数。在系统开始将表盘userInfo作为常规userInfo传输之前。 如果此属性为0,则表盘userInfo将作为常规userInfo传输。 当 Watch应用未启用表盘功能时, 其计数也为0。

    如果启用了表盘功能, 系统将立即尝试向 WatchKit Extension传输此userInfo, 且传输为高优先级。一旦收到当前的表盘功能的userInfo, 系统将在后台启动 WatchKit Extension并允许其更新并表盘内容。如果当前用户信息无法传输(即设备断开连接, 超出后台启动预算等), 它将在outstandingUserInfoTransfers队列中等待, 直到下一个合适的时间。

    需要注意的是, 在outstandingUserInfoTransfers队列中只能有一个当前的表盘的userInfo。如果当前表盘userInfo还在队列当中(等待传输), 并且再次传输了一个新的userInfo, 则新userInfo将被标记为当前需要传输的userInfo。而先前的userInfo将被取消标记, 那么无论如何它都将一直存在于outstandingUserInfoTransfers队列中了。

    表盘功能传输中接收方(即 Watch端)可以实现的代理与后台队列式字典传输的代理相同。

    前台传输

    在 WatchKit Extension与 iPhone进行传输的方法中, 前台传输是实时的, 且是队列式的传输方式。具体有两种方法, 一种是传输消息字典, 另一种是传输消息数据。

    前台消息字典传输

    在 Objective-C中前台消息字典传输的方法是sendMessage:replyHandler:errorHandler:, 在 Swift中函数如下:

    open func sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? = nil)
    

    此方法传入一个消息字典, 一个处理接收方回复的block, 以及一个错误处理block。消息的传递是异步的、高优先级的, 且只有在会话处于活动状态时才能调用此方法。如果指定了处理接收方回复的block, 则该block也会在后台线程上异步执行。

    需要注意的是, 从 WatchKit Extension激活并运行时调用此方法会在后台唤醒相应的 iOS App并使其可访问。但若从 iOS App调用此方法则不会唤醒相应的WatchKit Extension。如果调用此方法时接收方无法访问(即isReachable是 false), 则会执行errorHandlerblock并显示相应的错误。

    那么isReachable什么时候是true呢? 对于 WatchKit Extension来说, iOS设备在范围内, 因此可以进行通信并且 WatchKit Extension在前台运行,或者在后台运行时具有高优先级(例如, 在锻炼会话期间或当表盘加载其初始时间轴数据时); 对于 iOS来说, 配对且激活的 Apple Watch在范围内, 相应的WatchKit Extension正在运行。只要这样isReachable属性才会为true。

    而且当传输的消息字典中包含非属性列表数据类型, 也会调用errorHandlerblock。其他的类型数据应该用你下面的方法来进行传输。

    前台消息数据传输

    在 Objective-C中前台消息字典传输的方法是sendMessageData:replyHandler:errorHandler:, 在 Swift中函数如下:

    open func sendMessageData(_ data: Data, replyHandler: ((Data) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? = nil)
    

    此方法与消息字典传输的方法的区别在于所传输的主体内容为Data类型。包含非属性列表数据类型的传输, 就需要使用此方法了, 否则用上面方法将会报错。

    传输数据处理

    当你选择了合适的方式进行数据通信后, 就是处理这些接收到的数据和处理接收方回复了。核心就是在WCSessionDelegate中不同传输方式对应的不同代理方法中去处理。其实, 这些上面每个方法中已经详细说过了, 但为了知识的结构这里还是有必要提一下的, 详细的这里不赘述了。

    代码描述

    以前台消息字典传输为例, 由 WatchKit Extension向 iOS App发送消息。 WatchKit Extension中代码如下:

    if !WCSession.default.isReachable {
        let action = WKAlertAction(title: "OK", style: .default) {
            print("OK")
        }
        presentAlert(withTitle: "Failed", message: "Apple Watch is not reachable.", preferredStyle: .alert, actions: [action])
        return
    } else {
        // The counterpart is not available for living messageing
    }
    
    let date = Date(timeIntervalSinceNow: 0.0)
    let message = ["title": "Apple send a messge to iPhone", "watchMessage": "The Date is \(date.description)"]
    WCSession.default.sendMessage(message, replyHandler: { (replyMessage) in
        print(replyMessage)
        DispatchQueue.main.sync {
            self.contentLabel.setText(replyMessage["replyContent"] as? String)
        }
    }) { (error) in
        print(error.localizedDescription)
    }
    

    WatchKit Extension中实现对应代理方法, 以处理 iOS App发回的回复数据:

    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        DispatchQueue.main.sync {
            contentLabel.setText(message["iPhoneMessage"] as? String)
        }
    }
    

    iOS App也应实现对应代理, 以处理接收到的数据:

    @available(iOS 9.0, *)
    func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
        print(message)
        replyHandler(["title": "received successfully", "replyContent": "This is a reply from iPhone"])
    }
    

    数据共享

    Watch App和 WatchKit Extension间数据共享

    在运行时可以使用共享App Group在 Watch App和 WatchKit Extension之间共享媒体文件。 App Group创建一个多个进程可以访问的安全容器。 通常每个进程都在自己的沙箱环境中运行, 但是App Group允许两个进程共享一个公共目录。

    如何使用共享App Group

    1.在Xcode中打开项目的Capabilities选项卡。
    2.启用App Group功能。这将会添加一个entitlement file到指定的Target,并将一个唯一标识的App Group添加到该文件中。

    3.且需要注意Watch App和 WatchKit Extension的 Target必须都启用相同的App Group
    4.访问其中内容时, 使用NSFileManagercontainerURLForSecurityApplicationGroupIdentifier:方法取得文件的URL。

    文件存储

    WatchKit Extension的存储目录与iOS App的存储目录具有相同的基本结构。将用户数据和其他关键信息放在Documents目录中。如果将文件放在Caches目录中, 磁盘空间量较低时系统会删除它们。

    数据备份

    Apple Watch不会自动备份WatchKit Extension保存的文件。如果需要备份 Watch App中的数据, 则必须将该数据明确传输回iOS App并将其保存在那里。

    iCloud

    从 WatchOS 3开始, WatchKit Extension可以直接与CloudKit和其他iCloud技术进行通信。

    相关资料:
    Sharing Data
    WatchOS 开发教程源码:Watch-App-Sampler

    展开全文
  • OpenCV的Image Watch插件安装与使用

    万次阅读 多人点赞 2018-10-26 15:23:51
    OpenCV的Image Watch插件安装与使用 说来惭愧,一直觉得OpenCV在调试方面不如MATLAB灵活方便,没成想OpenCV官方早就推出了一个叫Image Watch的插件可用于调试时显示和监视图像变量了。这里简单记录一下插件的下载...

    说来惭愧,一直觉得OpenCV在调试方面不如MATLAB灵活方便,没成想OpenCV官方早就推出了一个叫Image Watch的插件可用于调试时显示和监视图像变量了。这里简单记录一下插件的下载安装与基本使用方法,供大家参考。本文示例使用的环境为:Windows10系统+vs2015+OpenCV3.4。

    Image Watch是Microsoft Visual Studio的一个插件,它允许我们在调试应用程序时可视化内存中的图像(例如,cv::Mat或IplImage_对象)。 这有助于跟踪错误,或者帮助我们了解特定的代码片段正在做什么(例如本文的示例代码中进行的变换)。

    本文的主要内容:

    • Image Watch插件安装需求
    • 插件下载和安装方法
    • 插件的使用方法
    • 示例代码

     

    安装该插件需要如下条件

    •      安装了Update 1的Visual Studio 2012 Professional(或更高版本)
    •      在Windows机器上完成了OpenCV的安装
    •      能够在Visual Studio中创建和构建OpenCV项目

    下载安装Image Watch

    Image Watch下载地址:https://marketplace.visualstudio.com/items?itemName=VisualCPPTeam.ImageWatch

    Image Watch安装方式:双击下载的ImageWatch.vsix文件,即可完成安装。

    使用Image Watch

    Image Watch适用于任何使用OpenCV图像对象的现有项目(例如,cv::Mat)。 下面给出一个简单的示例,加载一幅彩色图像,并将其转换为反色。 所使用的开发环境为Windows10,Visual Studio 2015。首先创建一个控制台应用程序项目,然后在下面插入源代码。别忘了将目标平台改为debug x64。

    #include "stdafx.h"
    #include "opencv.hpp"
    
    using namespace cv;
    int main()
    {
    	cv::Mat src, dst;
    	src = cv::imread("E:/images/Lena.jpg");
    	dst = src.clone();// 浅拷贝,共享数据区域,修改src2同时改变src1
    	// 遍历像素
    	for (int col = 0; col < width; col++)
    	{
    		for (int row = 0; row < height; row++)
    		{
    			Vec3b bgr = src.at<Vec3b>(row, col);
    			bgr[0] = 255 - bgr[0];
    			bgr[1] = 255 - bgr[1];
    			bgr[2] = 255 - bgr[2];
    			dst.at<Vec3b>(row, col) = bgr;
    		}
    	}
    
    	imshow("src",src);
    	imshow("-src", dst);
    	cv::waitKey();
        return 0;
    
    }
    
    

    确保使用的是debug模式,并且在适当的位置设置的断点,在本例中在第二个for循环的位置以及第一个imshow的位置分别设置断点。调试运行至断点时即可激活image watch插件。如果没有显示Image Watch窗口,可以使用如下方法调用:菜单栏->视图->其他窗口->image watch,调出该插件。

    请注意,vs IDE内置的“本地”窗口将仅显示文本。 而Image Watch插件就像是另一个Locals窗口,但内置了一个图像查看器。与Visual Studio的Locals窗口一样,Image Watch可以停靠到Visual Studio IDE。 此外,Visual Studio将记住我们是否打开了Image Watch,以及它在调试会话之间的位置。 也就是说只需执行此操作,下次开始调试时,Image Watch将返回之前我们离开的位置。 上图就是停靠的Image Watch窗口在断点处的样子。

    Image Watch窗口左上角的单选按钮(Locals / Watch)选择下面的图像列表中显示的内容:Locals列出当前作用域中的所有OpenCV图像对象(此列表自动填充)。 Watch显示已固定用于连续检查的图像表达式。 图像列表显示基本信息,例如宽度,高度,通道数,以及缩略图(如果有)。 在我们的示例中,图像列表包含两个本地图像变量,输入和边。

    如果图像具有缩略图,则左键单击该图像将在右侧的图像查看器中选择它以进行详细查看。 查看器允许平移(拖动鼠标)和缩放(鼠标滚轮)。 它还可以显示当前鼠标位置的像素坐标和色彩分量值,如下图所示。

    在图像上使用滚轮操作实现缩放,放大到一定尺寸后将同时显示像素的BGR分量,如上图所示。

    附加功能的使用

    图像监视插件在list栏某图像上单击右键弹出菜单,如下图所示。菜单项是:

    右键菜单各项功能说明:

    • Expand All/Collapse All: 展开/全部折叠,展开/折叠当前列表中的所有项目
    • Expand New Items: 展开新项目,控制是否最初展开或折叠新列表项目
    • Large Thumbnails: 大缩略图,在两个缩略图大小之间切换
    • Auto Maximize Contrast: 自动最大化对比度,如果未选中,则使用标准颜色映射规则将像素值映射到显示颜色。如果选中,则当前像素数据的值范围将映射到整个显示颜色范围(如Matlab的imagesc)。注意:此设置适用于所有图像。
    • 1-Channel Pseudo Color: 1通道伪彩色,如果未选中,则单通道图像显示为灰度。如果选中,则使用伪彩色图(如Matlab的colormap jet)。注意:此设置适用于所有图像。
    • 4-Channel Ignore Alpha: 4通道忽略Alpha,如果未选中,则四通道图像中的最后一个通道被解释为alpha。如果选中,则忽略最后一个通道。
    • Add to Watch: 添加到监视,将所选项目添加到监视列表
    • Add Address to Watch: 添加要监视的地址,将所选项的地址添加到监视列表。这对于在不同堆栈帧上观看图像很有用。
    • Dump to File: 转储到文件,将所选图像转储到文件。支持的格式为PNG,JPG和BIN(Image Watch内部无损文件格式)。BIN文件仅适用于Image Watch;可以使用@file运算符将它们加载到监视列表中。

    添加监视后可以逐步查看监视对象的变化。

    在图像浏览区(插件右侧)点击鼠标右键,也有一个菜单。可以方便的将图像缩放成原始大小或者适配显示区域。另一个比较有用的功能是Link View

    当选择了Link View后,切换到src图像时,自动显示的是刚才dst放大的区域,如下图所示 

    更多帮助可以直接点击插件窗口中的help按钮打开帮助文档。

    参考文档:https://opencv.org/image-watch-plugin-for-visual-studio.html

    本文更新链接:https://mp.csdn.net/postedit/83413877

    转载请注明出处。


    新书终于面市啦,《机器学习原理与编程实战》连接原理与实战:

    https://blog.csdn.net/iracer/article/details/116051674?spm=1001.2014.3001.5501

    展开全文
  • WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和...重点在于如何让iPhone和Apple Watch上的数据同步  1.背景。  Watch Connectivity--专为用来实现Watch...

      WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和Share Extension(分享扩展)。只要你对iOS开发有一定经验,UI的搭建相对是比较容易的。重点在于如何让iPhone和Apple Watch上的数据同步

      1.背景。

       Watch Connectivity--专为用来实现Watch与配对iPhone上的文件和数据的来回传输而生。既然我们说了WatchConnectivity是为文件和数据的来回传输而生,那我们看一下他的通讯图:

    我们看到这样的数据流是双向的,也就是说既可以Watch主动向iPhone发送数据,也可以让iPhone主动向Watch发送数据.

    2.WCSession

      通过查看苹果对WatchConnectivity
    <https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html>
         (链接地址:https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html#//apple_ref/doc/uid/TP40015269 <https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WatchConnectivity_framework/index.html>)
          API描述之后,我们发现对于Watch与iPhone其关联连接作用的类是WCSession,接下来我们来就了解一下WCSession,看一看他的使用。

      2.1 WCSession简单介绍

      我们查看WCSession的API(链接地址为:https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html#//apple_ref/occ/cl/WCSession <https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html>)之后,映入眼帘的是这一段代码:

    第一行代码的意思是:Session是永远支持WatchOS的,因此我们是为了检查iOS设置是否支持Session。

      第二行的代码意思是:获取一个默认Session实例

      第三行的代码意思是:设置Session的代理

      第四行的代码意思是:设置Session为活跃状态

      2.2WCSession的状态

      1】session.paired  是否已与设备配对

      2】session.watchAppInstalled  watchApp是否已安装

      3】session.complicationEnabled  complication 是否可用

    3.通讯的分类--WatchConnectivity框架的通信方式有两种模式,一种是后台传输,另一种是交互式消息。

      1】后台传输

      2】互动消息

      3.1 后台传输

      后台传输模式是最常用的通信模式,面向内容与用户交互,主要用于传输非即时的内容,体现在内容可由操作系统智能传输(操作系统允许发送方可退出,选择传输时机,支持接收者下次启动时发送),并将内容以队列方式发送。

      类型:

      应用上下文内容传输(Application Context)

      用户数据传输(UserInfo)

      文件传输 (File)

      三者数据传输的代码类似,我们只以File传输为例,写一下示例代码:

     

     

    传输:

    获取正在传输的文件内容:

    接收:

    接下来我们来实现一个效果,效果如下所示:

     (1)实现步骤

      获取默认WCSession 并开启

      实现WCSessionDelegate接收回调方法

      发送消息并处理响应消息

      接收端处理接收和响应(可选)

      (2)代码

      开启Session以及发送消息并处理响应消息代码

      激活Session

      实现WCSessionDelegate接收回调方法

     最后我们通过对比来回顾和深化一下Watch Connectivity框架

      1】iOS8 中 watch 与 iPhone之间通信只能通过 watch主动发起请求,iPhone响应这个请求的方式来完成一次通信,不能够iPhone直接连接watch向watch发送数据。

      iOS9中watch 与iPhone之间通信,可以双向操作,既可以watch主动发送数据到iPhone。也可以iPhone主动发送数据到Watch。

      2】iOS8中发送数据的内容只能为普通的字典数据类型。

      iOS9中不但能发送简单的字典数据,还可以支持发送一些数据(NSData)及文件类型

     https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/WatchKitProgrammingGuide/index.html#//apple_ref/doc/uid/TP40014969-CH8-SW1

    转载于:https://www.cnblogs.com/sunhaijin/p/5009719.html

    展开全文
  • iOS之Apple Watch简介和使用

    千次阅读 2017-02-15 10:56:42
    Apple Watch初步了解 简介 项目演示 创建项目 简单的hello world ...watch app:目前只允许包含storyboard文件和resource文件 InterfaceController:当前界面的控制器 与UIViewController的区别是:Int
  • rt。 打开手机的 watch 应用,进入蜂窝数据网,然后将微信和QQ设置为允许 Wi-Fi ,这样微信和QQ就可以使用无线局域网络了。坑!
  • 如何使用Apple Watch进行睡眠跟踪

    千次阅读 2020-09-19 06:54:36
    Kevin Parrish 凯文·帕里什 Without proper sleep, you can’t fully focus. Plus, a tired mind makes you prone to ... If you track your sleep on your Apple Watch, it can help you avoid these issues and ...
  • 使用Image Watch在Visual Studio调试器中查看内存中的图像预备条件安装使用举例更多功能... Image Watch是Microsoft Visual Studio的一个插件,它允许您在调试应用程序时可视化内存中的图像(例如cv::Mat或IplImage_...
  •  1.Schedule the watch and define an input:设置定时器和输入源(错误数据的查询条件)  2.Add a condition:设置触发条件(condition是否查询到了错误数据)  3.Take action:设置触发动作(action发现错误后...
  • AWS 使用 CloudWatch Logs 收集日志

    千次阅读 2017-01-12 11:23:00
    一个运行 CloudWatch Logs aws logs push 命令以将数据发送到 CloudWatch Logs 的脚本(守护程序)。 一个确保该守护程序始终运行的 cron 作业。 如果更喜欢官方文档,请参考 CloudWatch Logs 代理参考 。 ...
  • vue computed和watch详解

    千次阅读 2018-07-26 20:31:05
    1.概念 computed(计算属性)和watch(监听器)都是以vue的依赖追踪机制为基础的,当依赖数据... 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利用 computed 的值有缓存的特性,避免每...
  • 本文我们将研究如何使用AWS CloudWatch来更好地理解Lambda函数——实际使用了多少内存和执行时间。在此基础上,可以调整功能,以平衡成本问题,同时不降低性能。 AWS CloudWatch   早在去年11月,AWS就发布了Cloud...
  • 一 概念讲解 Apache atlas Api主要是对Type,Entity,... Atlas 类型系统,Atlas 允许用户为他们想要管理的元数据对象定义一个模型。该模型由称为 “类型” 的定义组成。被称为 “实体” 的 “类型” 实例表示被...
  • grafana使用MYSQL数据源展示

    千次阅读 2020-08-05 15:20:13
    官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。 每个数据源的查询语言和能力都是不同的。 你可以把来自多个数据源的数据组合到一个仪表板dashboard。 登录...
  • 官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等等,也可以自己安装插件,例如json数据源等。 官网传送门 我使用的es元数据是通过Logstash采集来的,感兴趣的...
  • Glance Interface 是WatchKit提供的一个Apple Watch入口。Glances页面不可以滑动...一个应用只允许有一个glance接口控制器,因此在使用glance显示你的数据的时候必须考虑这个问题。(只允许显示一个手表的屏幕大小)。
  • rsync是linux系统下的数据镜像备份工具,使用快速增量备份工具remote sync可以远程同步,可以在不同主机之间进行同步,可以实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此...
  • computed 计算属性 类似于过滤器,对绑定到试图的数据进行处理,并监听变化进而执行对应的代码 基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。...watch 选项允许我们执行异步操作 (访问一个 ...
  • Vue中computed、methods和watch之间的区别

    千次阅读 2019-04-09 11:21:01
    尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的。 在这个快速提示中,我们将了解Vue应用程序的这三个重要方面及其用例。我们将通过使用这三种方法中的每一种...
  • Grafana是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。 官网 操作文档 grafana安装 经常被用作...
  • 使用jq工具在Shell命令行处理JSON数据

    万次阅读 2014-08-05 08:44:13
    因为最近要处理一些 JSON 数据格式,所以在经过一番搜索后 最终找到了 jq 这个很棒的工具。jq 允许你直接在命令行下对 JSON 进行操作,包括分片、过滤、转换等等。 让我们通过几个例子来说明 jq 的功能: 一、输出...
  • AWS CloudWatch监控配置

    千次阅读 2020-04-08 08:00:00
    一、简介1. Amazon CloudWatch简介1.1 CloudWatch简介Amazon CloudWatch 实时监控您的 Amazon Web Services (AWS)...
  • watch窗口查看block,看到的是block的地址用block[0],只能看到一个值可以用 block,10 来同时查看多个值用(&block[2]),6 可以查看block[2]到[7] watch窗口语法规则 一.格式化数据和表达式赋值语句. 常用变量...
  • 计算属性是有缓存的,只要相关依赖没有改变,多次访问计算属性得到的值是之前缓存的计算结果,不会多次执行 methods则是调用才更新 从使用场景上说,computed 适用一个数据被多个数据影响,而 watch 适用一个数据...
  • watch: 更多的是「观察」的作用,类似于某些数据的监听回调 ,每当监听的数据变化时都会执行回调进行后续操作; 运用场景: 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 computed,因为可以利...
  • Rsync 实现服务器数据备份

    万次阅读 2021-05-20 09:03:30
    Rsync 是 Linux 系统下的数据镜像备份工具 ...
  • int *block; 在watch窗口查看block,看到的是block的地址 用block[0],只能看到一个值 ...格式化数据和表达式赋值语句.    常用变量格式化符(表达式的值后跟逗号,接格式化符,如"(int)0xFFFF
  • computed: computed是计算属性,依赖其他的属性值,并且computed的属性值有缓存属性,当属性值变化的时候,下一次获取computed属性的时候才会重新... 当我们需要进行数值计算,并且依赖于其它数据时,应该使用 co...
  • angularJS<六、$scope里的$watch方法>

    千次阅读 2015-09-14 08:34:04
    比如我们前面说到的脏数据检查脏数据检查调用$apply方法,调用evel进行数据解析,再调用$digest方法进行检查 ,在$digest执行时候,如果$watch观察到value与上一次执行时不一样时候就会触发进行数据更新;...
  • SpringBoot使用Nacos动态配置数据

    千次阅读 2021-03-17 09:35:44
    SpringBoot/SpringCloud项目部署运行后,如果使用硬编码方式定义数据源,那么如果需要更换数据库,就只能通过更改源码并重启的方式来达成目的 而SpringCloud生态中有配置中心这一组件,我们可以将数据源连接属性编写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,793
精华内容 16,317
关键字:

允许watch使用数据