promise_1.md

函数对象与实例对象详解

函数对象与实例对象

实例对象

new 函数产生的对象,称为实例对象,简称对象

函数对象

将函数作为对象使用,简称为函数对象👇
(函数其实就是一个对象,但只有当把函数作为对象使用时,才能体现它时函数对象,比如下面的.prototype就能体现Fn是个函数对象)
比如说

function Fn(){}    // Fn函数

const fn = new Fn();    // Fn()是构造函数,fn是实例对象(简称为对象)
console.log(Fn.prototype); 
Fn.bind({});   // Fn()是对象  

括号()的左边是函数,点.的左边是对象

回调函数

满足三个条件才能称为回调函数

  • 自己定义的函数
  • 自己没有亲自调用
  • 但最终执行了

回调函数主要分为两种👇

同步回调

立即执行,完全执行了才结束,不会放入回调队列中

异步回调

不会立即执行,会放入回调队列中将来执行

⚠️ 要判断是同步回调还是异步回调,可以在回调函数后面加一个console.log()(或者别的东西),如果这个console.log()后于回调函数执行了,那么这个回调函数就是同步的,否则是异步的

// 同步回调
const arr = [1, 2, 3];
// 这里括号中包的 item => {} 就是回调函数
arr.forEach(item => {
  console.log(item, "item");
})
console.log("forEach()执行之后打印");

console.log("-----------");

// 异步回调
setTimeout(() => {
  console.log("timeout callback");
}, 0);
console.log("setTimeOut()执行之前打印");

常见的内置error

promise中有成功回调和失败回调,这个就与error有关系了,下面来看一下

JS的error处理
error 类型
  • Error:所有错误的父亲类
    • ReferenceError: 引用错误,引用的变量不存在

    • TypeError: 数据类型不正确

    • RangeError:数据值不在其所允许的范围内

    • SyntaxError :语法错误

//   ReferenceError
  console.log(a);   // Uncaught ReferenceError: a is not defined
  console.log("----");   // 没有捕获error,下面的代码不执行


  //   TypeError
  let b = null;
  console.log(b.xxx);   // Uncaught TypeError: Cannot read property 'xxx' of null
  b.xxx;   // Uncaught TypeError: Cannot read property 'xxx' of null
  let b = {};
  b.xxx();   // Uncaught TypeError: b.xxx is not a function
  

  // RangeError
  // 函数内部调用自己会有一个次数的限制,超出了之后会报RangeError
  function fn(){ // 函数递归调用
    fn()
  }
  fn();       // Uncaught RangeError: Maximum call stack size exceeded
  

  // SyntaxError
  const c = """";   // Uncaught SyntaxError: Unexpected string
  // 正常应该是这样写 const c = "''";
error 处理
  • 捕获错误 try…catch
try {
    let a;
    console.log(a.xxx);
  } catch (error) {
    console.log(error);
    console.log(error.message,"error.message");
    console.log(error.stack,"error.stack");
  }
  • 抛出错误 throw error

try…catch中的错误是系统检测出来的错误,throw error是自己可以主动抛出的错误

  function some(){
    if(Date.now % 2 === 1){
      console.log("当前时间为奇数,可以执行");
    }else{
      throw new Error("当前时间为偶数,不能执行");
    }
  }

  try {
    some();
  } catch (error) {
    console.log(error.message);
  }
error 对象

error 对象中默认有两个属性,一个message,一个stack。其中:

  • message:错误相关信息,提示文本
  • stack:函数调用栈记录信息,带有相关信息的提示文本

Promise[翻译:承诺,许诺]

What Promise

  • 抽象表达

    Promise是JS中进行异步编程新的解决方案

    旧的解决方案是纯回调形式(纯回调的纯的意思是只有回调没有promise,因为promise中也有回调)

普通函数是函数去做什么,构造函数是它的实例去做什么

  • 具体表达
    • 语法上来说:promise是一个构造函数(构造函数主要是用来新建实例对象,也就是它的实例去干什么)
    • 功能上来说:promise对象用来封装一个异步操作并获取其结果

Promise 状态改变

Promise 有三种状态:

  • pending:初始状态
  • resolved:成功
  • rejected:失败

Promise状态的改变只有两种:

  • pending变为resolved
  • pending变为rejected

一个Promise对象只能改变一次,无论是成功还是失败,都会有一个结果数据;成功的结果数据一般称为value,失败的结果数据一般称为reason

Promise基本流程

Promise基本使用

// 1.创建一个新的Promise对象
    const p = new Promise((resolve, reject) => {
      // 这里的resolve和reject都是函数类型
      // 2.执行异步操作任务
      setTimeout(() => {
        const time = Date.now();
        if (time % 2 === 0) {
          // 3.1 成功则调用resolve(value)
          resolve("成功了,time:" + time);
        } else {
          // 3.2 失败则调用reject(reason)
          reject("失败了,time:" + time);
        }
      }, 1000);
    })

    p.then(
      value => { // 接收得到成功的value值   onResolved
        console.log("成功的回调:", value);
      },
      reason => { // 接收得到失败的reason值   onRejected
        console.log("失败的回调:", reason);
      }
    )

为什么用Promise

执行器函数是同步回调

  • 指定回调函数的方式更灵活

    具体怎么说呢?

    • 纯回调函数:必须在启动异步任务前指定
    • promise:启动异步任务 =》 返回promise对象 =》 给promise对象绑定回调函数(甚至可以在异步任务结束后指定也能得到结果数据)
// 1.创建一个新的Promise对象
        const p = new Promise((resolve, reject) => {
          // 这里的resolve和reject都是函数类型
          // 2.执行异步操作任务
          setTimeout(() => {
            const time = Date.now();
            if (time % 2 === 0) {
              // 3.1 成功则调用resolve(value)
              resolve("成功了,time:" + time);
            } else {
              // 3.2 失败则调用reject(reason)
              reject("失败了,time:" + time);
            }
          }, 1000);
        })
    
        setTimeout(() => {
          p.then(
          value => { // 接收得到成功的value值   onResolved
            console.log("成功的回调:", value);
          },
          reason => { // 接收得到失败的reason值   onRejected
            console.log("失败的回调:", reason);
          }
        )
        }, 2000);
        // 这里的2000ms可以看出指定回调函数是在成功/失败以后才指定的,因为前面的成功或失败只需要1秒钟
  • 支持链式调用,可以解决回调地狱问题

回调地狱问题:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件
回调地狱的缺点:不便于阅读,不便于异常处理。

// 回调地狱问题
    // 下面这三个函数串联执行(上一个执行完执行下一个)
    doSome(function (result) {
      doSomesecond(result, function (newResult) {
        doSomeThird(newResult, function (finalResult) {
          console.log('final result', finalResult);
        }, failureCallback)
      }, failureCallback)
    }, failureCallback)


// 使用Promise的链式调用解决回调地狱
    // 这个不是最好的解决方法,因为执行的过程中还是有回调函数。。
    doSome().then(function (result) {
      return doSomeSecond(retult);
    }).then(function (newResult) {
      return doSomeThird(newResult);
    }).then(function (finalResult){
      console.log('final result', finalResult);
    }).catch(failureCallback);
    // 上面三个函数doSome/doSomeSecond/doSomeThird中任何一个出现异常都会传到catch(failureCallback)
    // error能传递过来的这个处理叫做  异常传透



 // async/await 终极解决回调地狱方法
    async function request(){
      try {
        const result = await doSome();
        const newResult = await doSomeSecond();
        const finalResult = await doSomeThird();
        console.log('final result', finalResult);
      } catch (error) {
        failureCallback(error);
      }
    }

promise API

  • promise 构造函数: promise(excutor){}

    • excutor函数:同步执行 (resolver, reject) => {}
    • resolver函数:函数内部定义成功时调用的函数 value => {}
    • reject函数:函数内部定义失败时调用的函数 reason => {}

    说明:excutor会在promise内部立即同步回调,异步操作代码在执行器中执行

  • Promise.prototype.then()方法:(onResolved, onRejected) => {}

    • onResolved函数:成功的回调函数 (value) => {}
    • onRejected函数:失败的回调函数 (reason) => {}

    说明:指定用于得到成功 value 的成功回调和用于得到失败 reason 的失败回调,返回一个新的promise对象

  • Promise.prototype.catch()方法:(onRejected) => {}

    • onRejected函数:失败的回调函数 (reason) => {}

    说明:then()的语法糖,相当于:then(undefined, onRejected)

  • Promise.resolve()方法:(value) => {}

    • value:成功的数据或promise对象

    说明:返回一个成功/失败的promise对象

  • Promise.reject()方法:(reason) => {}

    • reason:失败的数据或promise对象

    说明:返回一个成功/失败的promise对象

  • Promise.all()方法:(promises) => {}

    • promises:包含n个promises的数组

    说明:返回一个新的promise,只有所有的promise都成功才成功,有一个失败了就直接失败

  • Promise.race()方法:(promises) => {}

    • promises:包含n个promises的数组

    说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态

卷 软件 的文件夹 PATH 列表 卷序列号为 C717-84E3 D:\opencv-4.10 │ LICENSE │ OpenCVConfig-version.cmake │ OpenCVConfig.cmake │ setup_vars_opencv4.cmd │ ├─bin │ opencv_videoio_ffmpeg4100_64.dll │ ├─etc │ ├─haarcascades │ │ haarcascade_eye.xml │ │ haarcascade_eye_tree_eyeglasses.xml │ │ haarcascade_frontalcatface.xml │ │ haarcascade_frontalcatface_extended.xml │ │ haarcascade_frontalface_alt.xml │ │ haarcascade_frontalface_alt2.xml │ │ haarcascade_frontalface_alt_tree.xml │ │ haarcascade_frontalface_default.xml │ │ haarcascade_fullbody.xml │ │ haarcascade_lefteye_2splits.xml │ │ haarcascade_license_plate_rus_16stages.xml │ │ haarcascade_lowerbody.xml │ │ haarcascade_profileface.xml │ │ haarcascade_righteye_2splits.xml │ │ haarcascade_russian_plate_number.xml │ │ haarcascade_smile.xml │ │ haarcascade_upperbody.xml │ │ │ ├─lbpcascades │ │ lbpcascade_frontalcatface.xml │ │ lbpcascade_frontalface.xml │ │ lbpcascade_frontalface_improved.xml │ │ lbpcascade_profileface.xml │ │ lbpcascade_silverware.xml │ │ │ └─licenses │ ade-LICENSE │ ffmpeg-license.txt │ ffmpeg-readme.txt │ flatbuffers-LICENSE.txt │ ippicv-EULA.rtf │ ippicv-readme.htm │ ippicv-third-party-programs.txt │ ippiw-EULA.rtf │ ippiw-support.txt │ ippiw-third-party-programs.txt │ ittnotify-LICENSE.BSD │ ittnotify-LICENSE.GPL │ libjpeg-turbo-LICENSE.md │ libjpeg-turbo-README.ijg │ libjpeg-turbo-README.md │ libopenjp2-LICENSE │ libopenjp2-README.md │ libpng-LICENSE │ libpng-README │ libtiff-COPYRIGHT │ mscr-chi_table_LICENSE.txt │ opencl-headers-LICENSE.txt │ openexr-AUTHORS.ilmbase │ openexr-AUTHORS.openexr │ openexr-LICENSE │ protobuf-LICENSE │ protobuf-README.md │ SoftFloat-COPYING.txt │ vasot-LICENSE.txt │ zlib-LICENSE │ ├─include │ └─opencv2 │ │ calib3d.hpp │ │ core.hpp │ │ cvconfig.h │ │ dnn.hpp │ │ features2d.hpp │ │ flann.hpp │ │ gapi.hpp │ │ highgui.hpp │ │ imgcodecs.hpp │ │ imgproc.hpp │ │ ml.hpp │ │ objdetect.hpp │ │ opencv.hpp │ │ opencv_modules.hpp │ │ photo.hpp │ │ stitching.hpp │ │ video.hpp │ │ videoio.hpp │ │ │ ├─calib3d │ │ calib3d.hpp │ │ calib3d_c.h │ │ │ ├─core │ │ │ affine.hpp │ │ │ async.hpp │ │ │ base.hpp │ │ │ bindings_utils.hpp │ │ │ bufferpool.hpp │ │ │ check.hpp │ │ │ core.hpp │ │ │ core_c.h │ │ │ cuda.hpp │ │ │ cuda.inl.hpp │ │ │ cuda_stream_accessor.hpp │ │ │ cuda_types.hpp │ │ │ cvdef.h │ │ │ cvstd.hpp │ │ │ cvstd.inl.hpp │ │ │ cvstd_wrapper.hpp │ │ │ cv_cpu_dispatch.h │ │ │ cv_cpu_helper.h │ │ │ directx.hpp │ │ │ dualquaternion.hpp │ │ │ dualquaternion.inl.hpp │ │ │ eigen.hpp │ │ │ fast_math.hpp │ │ │ mat.hpp │ │ │ mat.inl.hpp │ │ │ matx.hpp │ │ │ matx.inl.hpp │ │ │ neon_utils.hpp │ │ │ ocl.hpp │ │ │ ocl_genbase.hpp │ │ │ opengl.hpp │ │ │ operations.hpp │ │ │ optim.hpp │ │ │ ovx.hpp │ │ │ persistence.hpp │ │ │ quaternion.hpp │ │ │ quaternion.inl.hpp │ │ │ saturate.hpp │ │ │ simd_intrinsics.hpp │ │ │ softfloat.hpp │ │ │ sse_utils.hpp │ │ │ traits.hpp │ │ │ types.hpp │ │ │ types_c.h │ │ │ utility.hpp │ │ │ va_intel.hpp │ │ │ version.hpp │ │ │ vsx_utils.hpp │ │ │ │ │ ├─cuda │ │ │ │ block.hpp │ │ │ │ border_interpolate.hpp │ │ │ │ color.hpp │ │ │ │ common.hpp │ │ │ │ datamov_utils.hpp │ │ │ │ dynamic_smem.hpp │ │ │ │ emulation.hpp │ │ │ │ filters.hpp │ │ │ │ funcattrib.hpp │ │ │ │ functional.hpp │ │ │ │ limits.hpp │ │ │ │ reduce.hpp │ │ │ │ saturate_cast.hpp │ │ │ │ scan.hpp │ │ │ │ simd_functions.hpp │ │ │ │ transform.hpp │ │ │ │ type_traits.hpp │ │ │ │ utility.hpp │ │ │ │ vec_distance.hpp │ │ │ │ vec_math.hpp │ │ │ │ vec_traits.hpp │ │ │ │ warp.hpp │ │ │ │ warp_reduce.hpp │ │ │ │ warp_shuffle.hpp │ │ │ │ │ │ │ └─detail │ │ │ color_detail.hpp │ │ │ reduce.hpp │ │ │ reduce_key_val.hpp │ │ │ transform_detail.hpp │ │ │ type_traits_detail.hpp │ │ │ vec_distance_detail.hpp │ │ │ │ │ ├─detail │ │ │ async_promise.hpp │ │ │ dispatch_helper.impl.hpp │ │ │ exception_ptr.hpp │ │ │ │ │ ├─hal │ │ │ hal.hpp │ │ │ interface.h │ │ │ intrin.hpp │ │ │ intrin_avx.hpp │ │ │ intrin_avx512.hpp │ │ │ intrin_cpp.hpp │ │ │ intrin_forward.hpp │ │ │ intrin_lasx.hpp │ │ │ intrin_lsx.hpp │ │ │ intrin_msa.hpp │ │ │ intrin_neon.hpp │ │ │ intrin_rvv.hpp │ │ │ intrin_rvv071.hpp │ │ │ intrin_rvv_010_compat_non-policy.hpp │ │ │ intrin_rvv_010_compat_overloaded-non-policy.hpp │ │ │ intrin_rvv_011_compat.hpp │ │ │ intrin_rvv_compat_overloaded.hpp │ │ │ intrin_rvv_scalable.hpp │ │ │ intrin_sse.hpp │ │ │ intrin_sse_em.hpp │ │ │ intrin_vsx.hpp │ │ │ intrin_wasm.hpp │ │ │ msa_macros.h │ │ │ simd_utils.impl.hpp │ │ │ │ │ ├─opencl │ │ │ │ ocl_defs.hpp │ │ │ │ opencl_info.hpp │ │ │ │ opencl_svm.hpp │ │ │ │ │ │ │ └─runtime │ │ │ │ opencl_clblas.hpp │ │ │ │ opencl_clfft.hpp │ │ │ │ opencl_core.hpp │ │ │ │ opencl_core_wrappers.hpp │ │ │ │ opencl_gl.hpp │ │ │ │ opencl_gl_wrappers.hpp │ │ │ │ opencl_svm_20.hpp │ │ │ │ opencl_svm_definitions.hpp │ │ │ │ opencl_svm_hsa_extension.hpp │ │ │ │ │ │ │ └─autogenerated │ │ │ opencl_clblas.hpp │ │ │ opencl_clfft.hpp │ │ │ opencl_core.hpp │ │ │ opencl_core_wrappers.hpp │ │ │ opencl_gl.hpp │ │ │ opencl_gl_wrappers.hpp │ │ │ │ │ ├─parallel │ │ │ │ parallel_backend.hpp │ │ │ │ │ │ │ └─backend │ │ │ parallel_for.openmp.hpp │ │ │ parallel_for.tbb.hpp │ │ │ │ │ └─utils │ │ allocator_stats.hpp │ │ allocator_stats.impl.hpp │ │ filesystem.hpp │ │ fp_control_utils.hpp │ │ instrumentation.hpp │ │ logger.defines.hpp │ │ logger.hpp │ │ logtag.hpp │ │ tls.hpp │ │ trace.hpp │ │ │ ├─dnn │ │ │ all_layers.hpp │ │ │ dict.hpp │ │ │ dnn.hpp │ │ │ dnn.inl.hpp │ │ │ layer.details.hpp │ │ │ layer.hpp │ │ │ shape_utils.hpp │ │ │ version.hpp │ │ │ │ │ └─utils │ │ debug_utils.hpp │ │ inference_engine.hpp │ │ │ ├─features2d │ │ │ features2d.hpp │ │ │ │ │ └─hal │ │ interface.h │ │ │ ├─flann │ │ allocator.h │ │ all_indices.h │ │ any.h │ │ autotuned_index.h │ │ composite_index.h │ │ config.h │ │ defines.h │ │ dist.h │ │ dummy.h │ │ dynamic_bitset.h │ │ flann.hpp │ │ flann_base.hpp │ │ general.h │ │ ground_truth.h │ │ hdf5.h │ │ heap.h │ │ hierarchical_clustering_index.h │ │ index_testing.h │ │ kdtree_index.h │ │ kdtree_single_index.h │ │ kmeans_index.h │ │ linear_index.h │ │ logger.h │ │ lsh_index.h │ │ lsh_table.h │ │ matrix.h │ │ miniflann.hpp │ │ nn_index.h │ │ object_factory.h │ │ params.h │ │ random.h │ │ result_set.h │ │ sampling.h │ │ saving.h │ │ simplex_downhill.h │ │ timer.h │ │ │ ├─gapi │ │ │ core.hpp │ │ │ garg.hpp │ │ │ garray.hpp │ │ │ gasync_context.hpp │ │ │ gcall.hpp │ │ │ gcommon.hpp │ │ │ gcompiled.hpp │ │ │ gcompiled_async.hpp │ │ │ gcompoundkernel.hpp │ │ │ gcomputation.hpp │ │ │ gcomputation_async.hpp │ │ │ gframe.hpp │ │ │ gkernel.hpp │ │ │ gmat.hpp │ │ │ gmetaarg.hpp │ │ │ gopaque.hpp │ │ │ gproto.hpp │ │ │ gscalar.hpp │ │ │ gstreaming.hpp │ │ │ gtransform.hpp │ │ │ gtyped.hpp │ │ │ gtype_traits.hpp │ │ │ imgproc.hpp │ │ │ infer.hpp │ │ │ media.hpp │ │ │ opencv_includes.hpp │ │ │ operators.hpp │ │ │ ot.hpp │ │ │ render.hpp │ │ │ rmat.hpp │ │ │ s11n.hpp │ │ │ stereo.hpp │ │ │ video.hpp │ │ │ │ │ ├─cpu │ │ │ core.hpp │ │ │ gcpukernel.hpp │ │ │ imgproc.hpp │ │ │ ot.hpp │ │ │ stereo.hpp │ │ │ video.hpp │ │ │ │ │ ├─fluid │ │ │ core.hpp │ │ │ gfluidbuffer.hpp │ │ │ gfluidkernel.hpp │ │ │ imgproc.hpp │ │ │ │ │ ├─gpu │ │ │ core.hpp │ │ │ ggpukernel.hpp │ │ │ imgproc.hpp │ │ │ │ │ ├─infer │ │ │ bindings_ie.hpp │ │ │ bindings_onnx.hpp │ │ │ bindings_ov.hpp │ │ │ ie.hpp │ │ │ onnx.hpp │ │ │ ov.hpp │ │ │ parsers.hpp │ │ │ │ │ ├─oak │ │ │ infer.hpp │ │ │ oak.hpp │ │ │ │ │ ├─ocl │ │ │ core.hpp │ │ │ goclkernel.hpp │ │ │ imgproc.hpp │ │ │ │ │ ├─own │ │ │ assert.hpp │ │ │ convert.hpp │ │ │ cvdefs.hpp │ │ │ exports.hpp │ │ │ mat.hpp │ │ │ saturate.hpp │ │ │ scalar.hpp │ │ │ types.hpp │ │ │ │ │ ├─plaidml │ │ │ core.hpp │ │ │ gplaidmlkernel.hpp │ │ │ plaidml.hpp │ │ │ │ │ ├─python │ │ │ python.hpp │ │ │ │ │ ├─render │ │ │ render.hpp │ │ │ render_types.hpp │ │ │ │ │ ├─s11n │ │ │ base.hpp │ │ │ │ │ ├─streaming │ │ │ │ cap.hpp │ │ │ │ desync.hpp │ │ │ │ format.hpp │ │ │ │ meta.hpp │ │ │ │ queue_source.hpp │ │ │ │ source.hpp │ │ │ │ sync.hpp │ │ │ │ │ │ │ ├─gstreamer │ │ │ │ gstreamerpipeline.hpp │ │ │ │ gstreamersource.hpp │ │ │ │ │ │ │ └─onevpl │ │ │ accel_types.hpp │ │ │ cfg_params.hpp │ │ │ data_provider_interface.hpp │ │ │ default.hpp │ │ │ device_selector_interface.hpp │ │ │ source.hpp │ │ │ │ │ └─util │ │ any.hpp │ │ compiler_hints.hpp │ │ copy_through_move.hpp │ │ optional.hpp │ │ throw.hpp │ │ type_traits.hpp │ │ util.hpp │ │ variant.hpp │ │ │ ├─highgui │ │ highgui.hpp │ │ highgui_c.h │ │ │ ├─imgcodecs │ │ │ imgcodecs.hpp │ │ │ imgcodecs_c.h │ │ │ ios.h │ │ │ macosx.h │ │ │ │ │ └─legacy │ │ constants_c.h │ │ │ ├─imgproc │ │ │ bindings.hpp │ │ │ imgproc.hpp │ │ │ imgproc_c.h │ │ │ segmentation.hpp │ │ │ types_c.h │ │ │ │ │ ├─detail │ │ │ gcgraph.hpp │ │ │ legacy.hpp │ │ │ │ │ └─hal │ │ hal.hpp │ │ interface.h │ │ │ ├─ml │ │ ml.hpp │ │ ml.inl.hpp │ │ │ ├─objdetect │ │ aruco_board.hpp │ │ aruco_detector.hpp │ │ aruco_dictionary.hpp │ │ barcode.hpp │ │ charuco_detector.hpp │ │ detection_based_tracker.hpp │ │ face.hpp │ │ graphical_code_detector.hpp │ │ objdetect.hpp │ │ │ ├─photo │ │ │ cuda.hpp │ │ │ photo.hpp │ │ │ │ │ └─legacy │ │ constants_c.h │ │ │ ├─stitching │ │ │ warpers.hpp │ │ │ │ │ └─detail │ │ autocalib.hpp │ │ blenders.hpp │ │ camera.hpp │ │ exposure_compensate.hpp │ │ matchers.hpp │ │ motion_estimators.hpp │ │ seam_finders.hpp │ │ timelapsers.hpp │ │ util.hpp │ │ util_inl.hpp │ │ warpers.hpp │ │ warpers_inl.hpp │ │ │ ├─video │ │ │ background_segm.hpp │ │ │ tracking.hpp │ │ │ video.hpp │ │ │ │ │ ├─detail │ │ │ tracking.detail.hpp │ │ │ │ │ └─legacy │ │ constants_c.h │ │ │ └─videoio │ │ cap_ios.h │ │ registry.hpp │ │ videoio.hpp │ │ videoio_c.h │ │ │ └─legacy │ constants_c.h │ └─x64 └─vc17 ├─bin │ opencv_annotation.exe │ opencv_calib3d4100.dll │ opencv_core4100.dll │ opencv_dnn4100.dll │ opencv_features2d4100.dll │ opencv_flann4100.dll │ opencv_gapi4100.dll │ opencv_highgui4100.dll │ opencv_imgcodecs4100.dll │ opencv_imgproc4100.dll │ opencv_interactive-calibration.exe │ opencv_ml4100.dll │ opencv_model_diagnostics.exe │ opencv_objdetect4100.dll │ opencv_photo4100.dll │ opencv_stitching4100.dll │ opencv_version.exe │ opencv_version_win32.exe │ opencv_video4100.dll │ opencv_videoio4100.dll │ opencv_videoio_ffmpeg4100_64.dll │ opencv_visualisation.exe │ └─lib OpenCVConfig-version.cmake OpenCVConfig.cmake OpenCVModules-release.cmake OpenCVModules.cmake opencv_calib3d4100.lib opencv_core4100.lib opencv_dnn4100.lib opencv_features2d4100.lib opencv_flann4100.lib opencv_gapi4100.lib opencv_highgui4100.lib opencv_imgcodecs4100.lib opencv_imgproc4100.lib opencv_ml4100.lib opencv_objdetect4100.lib opencv_photo4100.lib opencv_stitching4100.lib opencv_video4100.lib opencv_videoio4100.lib 请分析是否正确
最新发布
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值