我正在使用 ArUco 标记来校正透视图并计算图像中的大小。在此图像中,我知道标记外边缘之间的确切距离,并使用它来计算黑色矩形的大小。
我的问题是aruco::detectMarkers并不总是识别标记的真实边缘(如细节图像中所示)。当我根据标记的角校正透视时,会导致失真,从而影响图像中对象的大小计算。
有没有办法提高 的边缘检测精度aruco::detectMarkers?
这是整个电路板的缩小照片:
这是左下角标记的详细信息,显示了边缘检测的不准确性:
以下是右上角标记的详细信息,显示了对同一标记 ID 的准确边缘检测:
在这个缩小的图像中很难看到,但左上角的标记准确,右下角的标记不准确。
我的函数调用detectMarkers:
bool findMarkers(const Mat image, Point2d outerMarkerCoordinates[], Point2d innerMarkerCoordinates[], Size2d *boardSize) {
Ptr<aruco::Dictionary> theDictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_1000);
vector<vector<Point2f> > markers;
vector<int> ids;
aruco::detectMarkers(image, theDictionary, markers, ids);
aruco::drawDetectedMarkers(image, markers, ids);
return true; //There's actually more code here that makes sure there are four markers.
}
Run Code Online (Sandbox Code Playgroud) 我正在关注这个例子。
以下是我用来检测标记的代码片段。我无法理解为什么这个例子对我不起作用。
import numpy as np
import cv2
import cv2.aruco as aruco
import os
im_names = filter(lambda x: x.endswith('.png'),
[f for f in os.listdir('local_vids_ims')])
for imn in im_names:
image = cv2.imread('local_vids_ims/' + imn)
# image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
parameters = aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detectMarkers(
image, aruco_dict, parameters=parameters)
print(corners, ids, rejectedImgPoints)
# aruco.drawDetectedMarkers(image, corners)
aruco.drawDetectedMarkers(image, rejectedImgPoints)
cv2.imshow('gray_im', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
目前我正在使用相机来检测标记.我使用opencv和Aruco Libary.
我现在才遇到问题.我需要检测2标记之间的距离是否小于特定值.我有一个计算距离的功能,我可以比较一切.但我正在寻找最有效的方法来跟踪所有标记(大约5/6)以及它们在一起的距离.
有一个带标记的列表,但我找不到比较所有标记的有效方法.
我有一个
Vector <Marker>
Run Code Online (Sandbox Code Playgroud)
我也有一个叫做的函数getDistance.
double getDistance(cv::Point2f punt1, cv::Point2f punt2)
{
float xd = punt2.x-punt1.x;
float yd = punt2.y-punt1.y;
double Distance = sqrtf(xd*xd + yd*yd);
return Distance;
}
Run Code Online (Sandbox Code Playgroud)
在Marker小号包含一个Point2f,这样我就可以轻松地对它们进行比较.
我正在使用opencv 3.2检测打印的Aruco标记:
aruco::estimatePoseSingleMarkers(corners, markerLength, camMatrix, distCoeffs, rvecs,tvecs);
Run Code Online (Sandbox Code Playgroud)
这将返回标记的平移和旋转矢量.我需要的是标记每个角落的3d坐标.
因为我知道标记长度,我可以做类似的事情
corner1 = tvecs[0] - markerlength /2;
corner2 = tvecs[0] + markerlength /2;
Run Code Online (Sandbox Code Playgroud)
....
但是有更好的方法吗?还是现有的功能?总结一下,我有:
在2d广场的中心的3d点.
那个方格两边的长度.
方形的旋转值.
如何找到角落的三维坐标?
我一直在使用 Python 的 OpenCV 库,使用 ArUco 进行对象跟踪。
目标是获取 ArUco 标记中心的 x/y/z 坐标,以及相对于校准相机的角度。
我能够使用迄今为止的代码在 aruco 标记上显示轴,但无法找到如何从旋转和平移向量中获取 x/y/z 坐标(如果这是正确的方法的话)。
这是定义旋转/平移向量的代码行:
rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerLength, camera_matrix, dist_coeffs) # For a single marker
Run Code Online (Sandbox Code Playgroud)
关于如何在相机世界中获取角度/标记位置有什么想法吗?
谢谢!
我正在尝试计算 aruco 标记和相机之间的精确(3 厘米错误率是可以接受的)距离。我使用 python、opencv 和 aruco。我可以检测到它们(标记侧为 0.023 米,即 2.3 厘米)但我无法解释距离,因为对于 40 厘米的距离,平移向量的范数为 1 米。我对此很困惑。任何人都可以帮忙吗?完整代码(抱歉,没有很好地记录):
import numpy as np
import cv2
import cv2.aruco as aruco
import glob
import argparse
import math
# Marker id infos. Global to access everywhere. It is unnecessary to change it to local.
firstMarkerID = None
secondMarkerID = None
cap = cv2.VideoCapture(0)
image_width = 0
image_height = 0
#hyper parameters
distanceBetweenTwoMarkers = 0.0245 # in meters, 2.45 cm
oneSideOfTheMarker = 0.023 # in meters, 2.3 cm …Run Code Online (Sandbox Code Playgroud) 我使用该函数cv.aruco.estimatePoseSingleMarkers()来获取rvec和tvec。使用这两个向量如何获得相对于 Aruco 标记的相机姿势?
while (True):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
aruco_dict = aruco.Dictionary_get(aruco.DICT_ARUCO_ORIGINAL)
parameters = aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)
font = cv2.FONT_HERSHEY_SIMPLEX
if np.all(ids != None):
# POSE ESTIMATION
rvec, tvec,_ = aruco.estimatePoseSingleMarkers(corners[0], 0.1, mtx, dist)
Run Code Online (Sandbox Code Playgroud) 我正在努力实现增强现实SceneKit.
通过使用ARuco(OpenCV增强现实库)估计标记的姿势,我得到了内在的相机矩阵和外在矩阵.
我用内在矩阵(fovy,aspect,zNear,zFar)的参数设置了SCNCamera's' projectionTransform.
通常在OpenGL,相对于相机坐标的世界坐标是使用ModelView计算的,但在SceneKit中,没有诸如modelView之类的东西.
因此,我计算了外部矩阵的逆矩阵,以获得相对于世界坐标(标记坐标)的相机坐标.
而且我认为我通过包含旋转和平移矩阵的逆矩阵得到了正确的摄像机位置.
但是我不能从那里获得相机的旋转.
你有什么想法?
我正在尝试使用 w10、python 3.6、opencv2 查找 aruco 标记。
我可以检测到标记,但在这一步失败
rvec, tvec = aruco.estimatePoseSingleMarkers(corners, markerLength, camera_matrix, dist_coeffs) # For a single marker
Run Code Online (Sandbox Code Playgroud)
我得到这个 python 异常:
ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)
在结果列表中省略 tvec 不会引发错误,但我没有翻译信息。
我正在尝试在特定坐标处的另一张图像上显示图像。我已经使用网络摄像头检测到了 aruco 标记,我想在 aruco 标记上显示另一个图像。可以移动 aruco 标记,并且叠加图像应与标记一起移动。
有各种绘图功能并将文本输入到图像中。我尝试过图像叠加和图像单应性。
我可以获得角落的坐标。是否有任何功能可以在这些坐标处插入图像?
import cv2
import cv2.aruco as aruco
import glob
markerLength = 0.25
cap = cv2.VideoCapture(0)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)
objpoints = []
imgpoints = []
images = glob.glob('calib_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)
img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
ret, mtx, dist, rvecs, tvecs …Run Code Online (Sandbox Code Playgroud)