现在,我正在尝试使用由opencv中的节点模块robot-js制作的屏幕截图。
但是由于某种原因,它以灰度显示。
这是我的代码:
My code:
'use strict';
const opencv = require('opencv'),
robot = require('robot-js'),
fs = require ("fs");
var process = robot.Process.getList("calc.exe")[0],
stream_wnd = new opencv.NamedWindow('Video',0),
target_wnd = process.getWindows()[0],
_image = robot.Image(),
_bounds = target_wnd.getBounds ();
while(true)
{
robot.Screen.grabScreen(_image,0,0,_bounds.w,_bounds.h,
process.getWindows()[0]);
stream_wnd.show(img2mat(_image,_bounds.h ,_bounds.w ));
stream_wnd.blockingWaitKey(1);
}
// imaget to matrix
function img2mat(img,size_x,size_y)
{
var _buffer = Buffer(size_x*size_y),
_data = img.getData(),
_matrix = new opencv.Matrix(size_x,size_y,opencv.Constants.CV_8UC1);
for(let index = 0; index < size_x*size_y ; index++)
{
_buffer[index] = _data[index] ;
}
_matrix.put(_buffer);
return _matrix;
}
我相信这是因为缓冲区大小错误,但是无法正确处理。
答案 0 :(得分:0)
已解决。 将robot-js图像转换为opencv矩阵的最终函数如下:
function img2mat(img,size_x,size_y)
{
let _data = img.getData(),
_matrix = new opencv.Matrix(size_x,size_y,opencv.Constants.CV_8UC4);
_matrix.put(_data);
return _matrix;
}
无需使用任何其他缓冲区。是的,问题在于香奈儿数量。 谢谢。
UPD:2018年8月8日 使用node4opencv可以更加轻松
// imaget to matrix
function img2mat(img,size_x,size_y)
{
return new opencv.Mat(img.getData(),size_x,size_y,opencv.CV_8UC4);
}
Btw节点opencv库不完整且已过时:C
答案 1 :(得分:0)
2019-01-22 :
const cv = require('opencv4nodejs')
const robot = require('robotjs')
function img2mat (img, width, height) {
return new cv.Mat(img, height, width, cv.CV_8UC4)
}
function screen2mat () {
let cap = robot.screen.capture(0, 0, 1920, 1080)
let mat = img2mat(cap.image, 1920, 1080)
return mat
}