国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node Opencv Addon

cgspine / 1293人閱讀

摘要:安裝使用下載安裝包解壓進入目錄編譯需要為系統(tǒng)生成,是基于的。

Opencv Node Addon Opencv 安裝使用

下載Opencv安裝包: http://opencv.org/releases.html

解壓進入Opencv目錄

編譯Opencv(需要cmake)

mkdir release
cd release
cmake -G "Unix Makefiles" .. (為Unix 系統(tǒng)生成Makefile,Mac OSX是基于Unix的。未安裝cmake 可以通過Homebrew安裝,未安裝Homebrew需安裝Homebrew)
make

安裝Opencv

make install

安裝完成的目錄

/usr/local/lib (Opencv庫文件)
/usr/local/include (Opencv頭文件)
/usr/local/share/ (Opencv xml配置文件)

使用Opencv(C++ Version)

編寫CMakeLists.txt文件

project( ORBFeatureAndCompare ) // 項目的名稱
cmake_minimum_required(VERSION 2.8) // cmake的版本要求
find_package( OpenCV REQUIRED ) // 查找對應(yīng)的Opencv依賴庫
find_package(Boost COMPONENTS log log_setup thread filesystem system) // 查找對應(yīng)的Boost依賴庫(下文出現(xiàn)Boost的安裝方法)
add_executable( ORBFeatureAndCompare ORBFeatureAndCompare )  // 指定可運行的文件
// 引入對應(yīng)的依賴庫文件的位置
target_link_libraries(ORBFeatureAndCompare
    ${OpenCV_LIBS}
    ${Boost_LOG_SETUP_LIBRARY}
    ${Boost_LOG_LIBRARY}
    ${Boost_FILESYSTEM_LIBRARY}
    ${Boost_THREAD_LIBRARY}
    ${Boost_SYSTEM_LIBRARY}
)

編寫Opencv的cpp文件

//必要的頭文件
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace boost::filesystem;  
namespace newfs = boost::filesystem;
using namespace cv;
using namespace std;

int main () {
  ....
  return 0;
}

創(chuàng)建一個images(其他命名都可以)的資源文件夾

cd images
cmake ..
make
./ORBFeatureAndCompare //編譯出的可執(zhí)行程序

安裝使用Boost進行數(shù)據(jù)序列化

下載Boost安裝包: https://dl.bintray.com/boosto...

解壓進入Boost目錄

編譯安裝Boost

./bootstrap.sh
./b2

引入Boost庫進行數(shù)據(jù)序列化,同樣是在CmakeList中引入文件路徑, 在cpp文件中使用

封裝cpp程序為Node Addon

依賴安裝

全局安裝node-gyp

本地安裝nan

編寫binding.gyp

{
  "targets": [
  {
    "target_name": "feature",
    "sources": [ "./src/feature.cc" ],
    "include_dirs": [
      "

編寫node c++ 插件

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace boost::filesystem;
namespace newfs = boost::filesystem;
using namespace v8;
using namespace std;

vector matToString(cv::Mat descriptorMat) {
  vector buf;
  imencode(".png", descriptorMat, buf);
  return buf;
}

vector descriptorMat(cv::Mat image) {
  vector keyPoint;
  cv::Ptr orb = cv::ORB::create(4000, 1.2f, 8, 31, 0, 2,             cv::ORB::HARRIS_SCORE, 31, 20);
  orb->detect(image, keyPoint);
  cv::Mat descriptorMat;
  orb->compute(image, keyPoint, descriptorMat);
  return matToString(descriptorMat);
}

void imageFeature(const FunctionCallbackInfo& args) {
  Isolate* isolate = args.GetIsolate();
  if (args.Length() < 1) {
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }
  if (!args[0]->IsString()) {
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong arguments")));
    return;
  }
  String::Utf8Value pathValue(Local::Cast(args[0]));
  string path = string(*pathValue);
  cv::Mat image = cv::imread(path, 1);
  if (image.empty()) {
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Input image error")));
    return;
  }
  vector descriptorString = descriptorMat(image);
  Local buf = Nan::NewBuffer(descriptorString.size()).ToLocalChecked();
  uchar* data = (uchar*) node::Buffer::Data(buf);
  memcpy(data, &descriptorString[0], descriptorString.size());
  v8::Local globalObj = Nan::GetCurrentContext()->Global();
  v8::Local bufferConstructor = v8::Local::Cast(globalObj->Get(Nan::New("Buffer").ToLocalChecked()));
  v8::Local constructorArgs[3] = {buf, Nan::New((unsigned)descriptorString.size()), Nan::New(0)};
  v8::Local actualBuffer = bufferConstructor->NewInstance(3, constructorArgs);
  args.GetReturnValue().Set(actualBuffer);
}

int bfMatcherCompare (cv::Mat &descriptors1, cv::Mat &descriptors2) {
  cv::BFMatcher matcher(cv::NORM_HAMMING);
  vector matches;
  matcher.match(descriptors1, descriptors2, matches);
  double max_dist = 0;
  double min_dist = 100;
  /*
  for (int i = 0; i < descriptors1.rows; i++)
  {
    double dist = matches[i].distance;
    if (dist < min_dist)
      min_dist = dist;
    if (dist > max_dist)
      max_dist = dist;
  }
  vector good_matches;
  for (int i = 0; i < descriptors1.rows; i++)
  {
    if (matches[i].distance < 3 * min_dist)
      good_matches.push_back(matches[i]);
  }
  return good_matches.size();
  */
  for (int i = 0; i < descriptors1.rows; i++) {
    double dist = matches[i].distance;
    if (dist < min_dist) {
      min_dist = dist;
    }
    if (dist > max_dist) {
      max_dist = dist;
    }
  }
  std::vector good_matches;
  double good_matches_sum = 0.0;

  for (int i = 0; i < descriptors1.rows; i++) {
    double distance = matches[i].distance;
    if (distance <= std::max(2 * min_dist, 0.02)) {
      good_matches.push_back(matches[i]);
      good_matches_sum += distance;
    }
  }
  return (double) good_matches_sum / (double) good_matches.size();
}

void similarity(const FunctionCallbackInfo& args) {
  Isolate* isolate = args.GetIsolate();
  Local arg1 = args[0]->ToObject();
  int size1 = args[1]->NumberValue();
  Local arg2 = args[2]->ToObject();
  int size2 = args[3]->NumberValue();
  if (args.Length() < 4) {
    isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "Wrong number of arguments")));
    return;
  }
  uchar*buffer1 = (uchar*) node::Buffer::Data(arg1);
  std::vector vec1(buffer1, buffer1 +  (unsigned int) size1);
  cv::Mat img_decode1;
  img_decode1 = cv::imdecode(vec1, CV_8U);
  uchar*buffer2 = (uchar*) node::Buffer::Data(arg2);
  std::vector vec2(buffer2, buffer2 +  (unsigned int) size2);
  cv::Mat img_decode2;
  img_decode2 = cv::imdecode(vec2, CV_8U);
  int similarity = bfMatcherCompare(img_decode1, img_decode2);
  args.GetReturnValue().Set(similarity);
}

void init(Local exports, Local module) {
  NODE_SET_METHOD(exports, "imageFeature", imageFeature);
  NODE_SET_METHOD(exports, "similarity", similarity);
}

NODE_MODULE(addon, init)

編寫Js文件

const feature = require("./build/Release/feature");

exports.getImageFeature = (filePath) => {
  return feature.imageFeature(filePath).toString("utf8");
};

exports.getImageSimilarity = (descriptor1, descriptor2) => {
  let matBuffer1 = Buffer.from(descriptor1);
  let matBuffer2 = Buffer.from(descriptor2);
  return feature.similarity(matBuffer1, matBuffer1.length, matBuffer2, matBuffer2.length);
};

編譯運行

node-gyp configure build
node test.js

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/82576.html

相關(guān)文章

  • 干貨 | 走進Node.js之啟動過程剖析

    摘要:具體調(diào)用鏈路如圖函數(shù)主要是解析啟動參數(shù),并過濾選項傳給引擎。查閱文檔之后發(fā)現(xiàn),通過指定參數(shù)可以設(shè)置線程池大小。原來的字節(jié)碼編譯優(yōu)化還有都是通過多線程完成又繼續(xù)深入調(diào)查,發(fā)現(xiàn)環(huán)境變量會影響的線程池大小。執(zhí)行過程如下調(diào)用執(zhí)行。 作者:正龍 (滬江Web前端開發(fā)工程師)本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 隨著Node.js的普及,越來越多的開發(fā)者使用Node.js來搭建環(huán)境,也有很多公司開始把...

    luck 評論0 收藏0
  • 干貨剖析 | 走進Node.js之啟動過程

    摘要:具體調(diào)用鏈路如圖函數(shù)主要是解析啟動參數(shù),并過濾選項傳給引擎。查閱文檔之后發(fā)現(xiàn),通過指定參數(shù)可以設(shè)置線程池大小。原來的字節(jié)碼編譯優(yōu)化還有都是通過多線程完成又繼續(xù)深入調(diào)查,發(fā)現(xiàn)環(huán)境變量會影響的線程池大小。執(zhí)行過程如下調(diào)用執(zhí)行。 作者:正龍 (滬江Web前端開發(fā)工程師)本文原創(chuàng),轉(zhuǎn)載請注明作者及出處。 隨著Node.js的普及,越來越多的開發(fā)者使用Node.js來搭建環(huán)境,也有很多公司開始把...

    Simon 評論0 收藏0
  • 用NAN寫一個nodejs的c++擴展

    摘要:介紹的全稱為其表現(xiàn)上是一個包。引用擴展,暴露出方法供上層使用。初次開發(fā)擴展的用戶需要注意下項目目錄中的文件會讀取項目中的為表示最后生成的擴展文件名為。累加完成后通過將結(jié)果返回出去。 NAN介紹 NAN的全稱為Native Abstraction for Node.js, 其表現(xiàn)上是一個Node.js包。安裝后,就得到一堆C++頭文件,里面是一堆宏。它主要為Node.js和V8跨版本提供...

    魏明 評論0 收藏0
  • Mac下安裝node-opencv

    摘要:安裝一個包也需要寫成文章既然你看到這了你就知道是啥東西就不介紹了啊是在的基礎(chǔ)上封裝了一層使用時會調(diào)用底層的使用編寫的來實現(xiàn)圖像處理的功能所以不單單的安裝一個包各種嘗試說實話這塊才是最頭痛的事如果你搜索安裝你能搜到很多結(jié)果但是他們好像都串通 安裝一個node包也需要寫成文章? 既然你看到這了, 你就知道opencv是啥東西, 就不介紹了啊, node-opencv是在opencv的基礎(chǔ)上...

    lavor 評論0 收藏0
  • vscode調(diào)試node.js c++擴展

    摘要:類似的,如果我們想要調(diào)試擴展,我們也需要擴展源文件的調(diào)試符號信息。配置安裝插件這里我們將用來調(diào)試擴展。配置輸入配置一個任務(wù),該任務(wù)會執(zhí)行,生成帶調(diào)試信息的擴展文件。 Debugging NodeJS C++ addons using VS Code 之前筆者寫了一篇 用NAN寫一個nodejs的c++擴展, 實際開發(fā)過程中,肯定是有單步調(diào)試的需求。這里簡單介紹用如何用vscode調(diào)試...

    王偉廷 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<