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

資訊專(zhuān)欄INFORMATION COLUMN

Node Opencv Addon

cgspine / 1297人閱讀

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

Opencv Node Addon Opencv 安裝使用

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

解壓進(jìn)入Opencv目錄

編譯Opencv(需要cmake)

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

安裝Opencv

make install

安裝完成的目錄

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

使用Opencv(C++ Version)

編寫(xiě)CMakeLists.txt文件

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

編寫(xiě)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)建一個(gè)images(其他命名都可以)的資源文件夾

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

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

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

解壓進(jìn)入Boost目錄

編譯安裝Boost

./bootstrap.sh
./b2

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

封裝cpp程序?yàn)镹ode Addon

依賴(lài)安裝

全局安裝node-gyp

本地安裝nan

編寫(xiě)binding.gyp

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

編寫(xiě)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)

編寫(xiě)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);
};

編譯運(yùn)行

node-gyp configure build
node test.js

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

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

相關(guān)文章

  • 干貨 | 走進(jìn)Node.js之啟動(dòng)過(guò)程剖析

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

    luck 評(píng)論0 收藏0
  • 干貨剖析 | 走進(jìn)Node.js之啟動(dòng)過(guò)程

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

    Simon 評(píng)論0 收藏0
  • 用NAN寫(xiě)一個(gè)nodejs的c++擴(kuò)展

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

    魏明 評(píng)論0 收藏0
  • Mac下安裝node-opencv

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

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

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

    王偉廷 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<