如何从opencv.js查找角向量
这是我代码的一部分如何从opencv.js查找角向量,opencv,opencv-contour,Opencv,Opencv Contour,这是我代码的一部分 export default class Comp extends Component { onChange = async evt => { const { files } = evt.target const reader = new FileReader() reader.onload = (e) => this.refs.preview.src = e.target.result reader.readAsDataURL
export default class Comp extends Component {
onChange = async evt => {
const { files } = evt.target
const reader = new FileReader()
reader.onload = (e) => this.refs.preview.src = e.target.result
reader.readAsDataURL(files[0])
this.refs.preview.onload = () => {
let src = cv.imread(this.refs.preview)
let dst = new cv.Mat()
cv.cvtColor(src, src, cv.COLOR_RGB2GRAY, 0)
cv.threshold(src, src, 180, 300, cv.THRESH_BINARY)
let largest_area = 0
let largest_contour_index = 0
let dst1 = cv.Mat.zeros(src.rows, src.cols, cv.CV_8UC3)
let contours = new cv.MatVector()
let hierarchy = new cv.Mat()
cv.findContours(src, contours, hierarchy, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
for (let i = 0; i < contours.size(); ++i) {
let color = new cv.Scalar(255, 0, 0)
let color2 = new cv.Scalar(0, 255, 0)
let area = cv.contourArea(contours.get(i))
if (area > largest_area) {
largest_area = area
largest_contour_index = i
cv.drawContours(dst1, contours, i, color, 5, cv.LINE_8)
}
}
cv.imshow('processed', dst1)
src.delete()
dst.delete()
dst1.delete()
}
}
render() {
return (
<div>
<form action="">
<input type="file" onChange={this.onChange} />
</form>
<div className='flex'>
<div className='flex-1'>
<img ref='preview' id='preview' style={{ width: '100%' }} />
</div>
<div className='flex-1'>
<canvas id='processed' />
<img ref='processed' style={{ width: '100%' }} />
</div>
</div>
</div>
)
}
}
结果是
我想获取这些等高线数据并进行透视变换,然后将其保存到db。我假设您使用的是Java。我的技术不是很好,我的核心是C++,Python也可以。p> 无论如何我都会尽力帮忙的
vector<vector<Point> > contours;
然后可以选择使用三维或二维变换。
用于三维可视化/AR its
var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())
\\plz find it. this is just a sample. find camera matrix and do unistort
var rvec
var tvec
cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )
然后你有矩阵
然后应用变换
但我想你可能只是在做那些文书工作,你只需要二维变换,然后就可以了
Mat H = Calib3d.findHomography( objMat, sceneMat, Calib3d.RANSAC, ransacReprojThreshold );
//-- Get the corners from the image_1 ( the object to be "detected" )
Mat objCorners = new Mat(4, 1, CvType.CV_32FC2), sceneCorners = new Mat();
float[] objCornersData = new float[(int) (objCorners.total() * objCorners.channels())];
objCorners.get(0, 0, objCornersData);
objCornersData[0] = 0;
objCornersData[1] = 0;
objCornersData[2] = imgObject.cols();
objCornersData[3] = 0;
objCornersData[4] = imgObject.cols();
objCornersData[5] = imgObject.rows();
objCornersData[6] = 0;
objCornersData[7] = imgObject.rows();
objCorners.put(0, 0, objCornersData);
Core.perspectiveTransform(objCorners, sceneCorners, H);
float[] sceneCornersData = new float[(int) (sceneCorners.total() * sceneCorners.channels())];
sceneCorners.get(0, 0, sceneCornersData);
DB我不是很熟悉。我只擅长使用旧的基于C.net的方法。其他人从不接触。但是一旦你有了图像,只需在数据库中为你的图像做推送。应该没什么问题
编辑
您可以按照下面的链接进行实施
选择Java版本
你只需要从这两个链接复制代码。你可以走了。Java是最乏味的学习方式。假设C++是使用java的,所以C++或Python是一个更好的选择。我的技术不是很好,我的核心是C++,Python也可以。p> 无论如何我都会尽力帮忙的
vector<vector<Point> > contours;
然后可以选择使用三维或二维变换。
用于三维可视化/AR its
var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())
\\plz find it. this is just a sample. find camera matrix and do unistort
var rvec
var tvec
cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )
然后你有矩阵
然后应用变换
但我想你可能只是在做那些文书工作,你只需要二维变换,然后就可以了
Mat H = Calib3d.findHomography( objMat, sceneMat, Calib3d.RANSAC, ransacReprojThreshold );
//-- Get the corners from the image_1 ( the object to be "detected" )
Mat objCorners = new Mat(4, 1, CvType.CV_32FC2), sceneCorners = new Mat();
float[] objCornersData = new float[(int) (objCorners.total() * objCorners.channels())];
objCorners.get(0, 0, objCornersData);
objCornersData[0] = 0;
objCornersData[1] = 0;
objCornersData[2] = imgObject.cols();
objCornersData[3] = 0;
objCornersData[4] = imgObject.cols();
objCornersData[5] = imgObject.rows();
objCornersData[6] = 0;
objCornersData[7] = imgObject.rows();
objCorners.put(0, 0, objCornersData);
Core.perspectiveTransform(objCorners, sceneCorners, H);
float[] sceneCornersData = new float[(int) (sceneCorners.total() * sceneCorners.channels())];
sceneCorners.get(0, 0, sceneCornersData);
DB我不是很熟悉。我只擅长使用旧的基于C.net的方法。其他人从不接触。但是一旦你有了图像,只需在数据库中为你的图像做推送。应该没什么问题
编辑
您可以按照下面的链接进行实施
选择Java版本
你只需要从这两个链接复制代码。你可以走了。Java是最乏味的学习方式。个人C++或Python是一个更好的选择,去使用我使用OpenCV.JS,它的JavaScript很难找出相对的API到JavaScript。但我认为想法是一样的。无论如何,谢谢。我使用opencv.js,它的javascript很难找出与javascript相对应的api。但我认为想法是一样的。无论如何,谢谢。