I have updated the opencv library to the latest code aswell. I still see the same copy issue.
updating the entire code
β β β
static void detect(cv::Ptr<cv::aruco::Dictionary> &dictionary,std::vector<std::vector<cv::Point2f> > &corners, std::vector<int> &ids, CVPixelBufferRef pixelBuffer) {
// grey scale channel at 0
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
void *baseaddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
CGFloat width = CVPixelBufferGetWidth(pixelBuffer);
CGFloat height = CVPixelBufferGetHeight(pixelBuffer);
cv::Mat mat(height, width, CV_8UC1, baseaddress, 0); //CV_8UC1
cv::aruco::detectMarkers(mat,dictionary,corners,ids);
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
+(NSMutableArray *) estimatePose:(CVPixelBufferRef)pixelBuffer withIntrinsics:(matrix_float3x3)intrinsics andMarkerSize:(Float64)markerSize {
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::Ptr<cv::aruco::CharucoBoard> charucoBoard = cv::aruco::CharucoBoard::create(5, 7, 0.03636f, 0.02951f, dictionary);
std::vector<int> ids;
std::vector<std::vector<cv::Point2f>> corners;
detect(dictionary, corners, ids, pixelBuffer);
NSMutableArray *arrayMatrix = [NSMutableArray new];
if(ids.size() == 0) {
return arrayMatrix;
}
cv::Mat intrinMat(3,3,CV_64F);
intrinMat.at<Float64>(0,0) = intrinsics.columns[0][0];
intrinMat.at<Float64>(0,1) = intrinsics.columns[1][0];
intrinMat.at<Float64>(0,2) = intrinsics.columns[2][0];
intrinMat.at<Float64>(1,0) = intrinsics.columns[0][1];
intrinMat.at<Float64>(1,1) = intrinsics.columns[1][1];
intrinMat.at<Float64>(1,2) = intrinsics.columns[2][1];
intrinMat.at<Float64>(2,0) = intrinsics.columns[0][2];
intrinMat.at<Float64>(2,1) = intrinsics.columns[1][2];
intrinMat.at<Float64>(2,2) = intrinsics.columns[2][2];
std::vector<cv::Vec3d> rvecs, tvecs;
cv::Mat distCoeffs = cv::Mat::zeros(8, 1, CV_64F);
//cv::aruco::estimatePoseSingleMarkers(corners, markerSize, intrinMat, distCoeffs, rvecs, tvecs);
cv::aruco::estimatePoseBoard(corners, ids, charucoBoard, intrinMat, distCoeffs, rvecs, tvecs);
NSLog(@"found: rvecs.size(): %lu", rvecs.size());
cv::Mat rotMat, tranMat;
for (int i = 0; i < rvecs.size(); i++) {
cv::Rodrigues(rvecs[i], rotMat);
cv::Mat extrinsics = rotateRodriques(rotMat, tvecs[i]);
SCNMatrix4 scnMatrix = [ArucoCV transformToSceneKitMatrix:extrinsics];
SKWorldTransform *transform = [SKWorldTransform new];
transform.arucoId = ids[i];
transform.transform = scnMatrix;
[arrayMatrix addObject:transform];
}
return arrayMatrix;
}
error:
terminating with uncaught exception of type cv::Exception: OpenCV(4.6.0) /Users/runner/work/opencv-contrib-ios/opencv-contrib-ios/opencv-4.6.0/modules/core/src/copy.cpp:320: error: (-215:Assertion failed) channels() == CV_MAT_CN(dtype) in function βcopyToβ