问题描述
以下是我编写的代码,它从目录 .jpg
读取 './pose_images'
图像并检测标记 id 和角点。
from absl import flags,app
from pathlib import Path
from tqdm import tqdm,trange
import cv2
import sys
import joblib
import os
import numpy as np
FLAGS = flags.FLAGS
flags.DEFINE_string('aruco_dict','7x7','aruco dict. used for board generation DEFAULT:4x4')
flags.DEFINE_integer('columns',7,'number of columns in board')
flags.DEFINE_integer('rows','number of rows in board')
def read_chessboards(images):
"""
Charuco base pose estimation.
"""
print("POSE ESTIMATION STARTS:")
allCorners = []
allIds = []
decimator = 0
# SUB PIXEL CORNER DETECTION CRITERION
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,100,0.00001)
# aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
if '4x4' in FLAGS.aruco_dict:
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_4X4_1000)
board = cv2.aruco.CharucoBoard_create(FLAGS.columns,FLAGS.rows,1,.8,aruco_dict)
if '5x5' in FLAGS.aruco_dict:
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_5X5_1000)
board = cv2.aruco.CharucoBoard_create(FLAGS.columns,aruco_dict)
if '6x6' in FLAGS.aruco_dict:
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_1000)
board = cv2.aruco.CharucoBoard_create(FLAGS.columns,aruco_dict)
if '7x7' in FLAGS.aruco_dict:
aruco_dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_7X7_1000)
board = cv2.aruco.CharucoBoard_create(FLAGS.columns,aruco_dict)
for im in tqdm(images,"PROCESSING IMAGE:",total=len(images)):
# print("=> Processing image {0}".format(im))
frame = cv2.imread(str(im))
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
corners,ids,rejectedImgPoints = cv2.aruco.detectMarkers(gray,aruco_dict)
allCorners.append(corners)
allIds.append(ids)
return allCorners,allIds
def main(argv):
if not Path('./pose_images').is_dir():
print(f"NO DIR. NAMED \'pose_images\' EXISTS")
sys.exit()
images = list(Path('./pose_images').glob('*.jpg'))
allCorners,allIds = read_chessboards(images)
print(f"ALL-CORNERS list length : {allCorners.__len__()}")
print(f"ALL-IDs list length : {allIds.__len__()}")
# print(f"IMGs SHAPE : {imsize}")
K = np.array([[2.9734482e+03,0.0000000e+00,2.0244724e+03],[0.0000000e+00,2.9734482e+03,1.1212526e+03],1.0000000e+00]],dtype=np.float32)
rvecs,tvecs,_= cv2.aruco.estimatePoseSingleMarkers(np.array(allCorners).astype(np.float64),0.10,K,distCoeffs=None)
print(35*'%')
for corners,id,img_path in tqdm(zip(allCorners,allIds,images),desc='PROCESSING #',total=len(allIds)):
img = cv2.imread(str(img_path))
corners = list(corners[0].squeeze()) # [4,2] list
# print(type(corners))
# print(len(corners))
for c in tqdm(corners,desc="CORNER #"):
img = cv2.circle(img,tuple(c),20,(0,255),-1)
cv2.imwrite(f"./pose_images/results/{os.path.basename(img_path).split('.')[0]}.png",img)
print(f"RESULTS SAVED")
if __name__ == '__main__':
app.run(main)
之后,它尝试使用 cv2.aruco.estimatePoseSingleMarkers()
函数估计姿势,但显示以下错误:
cv2.error: OpenCV(3.4.3) C:\projects\opencv-python\opencv\modules\calib3d\src\solvepnp.cpp:65: error: (-215:Assertion Failed) ( (npoints >= 4) || (npoints == 3 && fla
gs == SOLVEPNP_IteraTIVE && useExtrinsicGuess) ) && npoints == std::max(ipoints.checkVector(2,CV_32F),ipoints.checkVector(2,CV_64F)) in function 'cv::solvePnP'
我尝试更改数据类型,但无济于事。你能找出错误在哪里吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)