C++ 工业摄像机上无法识别OpenCV Aruco标记
我正在一种工业自动化技术C2摄像机上检测阿鲁科标记,这种摄像机设计用于检测三角测量扫描仪中的激光条纹,但它们也可以捕获图像。 我的问题是,除了我前面提到的那个摄像头外,无论我使用什么摄像头,都会检测到相同的标记。 下面是我的代码的最小工作示例:C++ 工业摄像机上无法识别OpenCV Aruco标记,c++,opencv,aruco,C++,Opencv,Aruco,我正在一种工业自动化技术C2摄像机上检测阿鲁科标记,这种摄像机设计用于检测三角测量扫描仪中的激光条纹,但它们也可以捕获图像。 我的问题是,除了我前面提到的那个摄像头外,无论我使用什么摄像头,都会检测到相同的标记。 下面是我的代码的最小工作示例: #include <opencv2/highgui.hpp> #include <opencv2/aruco/charuco.hpp> using namespace std; using namespace cv; int
#include <opencv2/highgui.hpp>
#include <opencv2/aruco/charuco.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[]) {
int squaresX = 10;
int squaresY = 7;
float squareLength = 28;
float markerLength = 19;
int dictionaryId = 6;
bool showRejected = true;
bool refindStrategy = true;
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
Ptr<aruco::Dictionary> dictionary =
aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
// create charuco board object
Ptr<aruco::CharucoBoard> charucoboard =
aruco::CharucoBoard::create(squaresX, squaresY, squareLength, markerLength, dictionary);
Ptr<aruco::Board> board = charucoboard.staticCast<aruco::Board>();
Mat image = imread("C:\\Users\\Piotrek\\Desktop\\calib\\022.jpg"), imageCopy;
vector< int > markerIds, charucoIds;
vector< vector< Point2f > > markerCorners, rejectedMarkers;
vector< Point2f > charucoCorners;
// detect markers
aruco::detectMarkers(image, dictionary, markerCorners, markerIds, detectorParams,
rejectedMarkers);
image.copyTo(imageCopy);
if (markerIds.size() > 0) {
aruco::drawDetectedMarkers(imageCopy, markerCorners);
}
if (showRejected && rejectedMarkers.size() > 0)
aruco::drawDetectedMarkers(imageCopy, rejectedMarkers, noArray(), Scalar(100, 0, 255));
//display results
imshow("out", imageCopy);
waitKey(0);
return 0;
}
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(int argc,char*argv[]){
整数平方x=10;
int squaresY=7;
浮点数平方长度=28;
浮动标记长度=19;
int=6;
bool showRejected=true;
bool refindStrategy=true;
Ptr
问题是检测到标记,但由于未知原因,标记被拒绝:
我使用OpenCV 3.1。问题解决了。我必须翻转图像,现在标记被完美地检测到。是的,在x方向翻转图像可以解决问题
opencv cv::flip(image, flippedImage, 1)
你能解释一下为什么它需要翻转吗?看起来这也解决了我的问题,但我不知道为什么它需要翻转。结果,在我的例子中,我创建了一个阿鲁科标记的位掩码,但在从垫子中获取位时,却混淆了x/y和y/x。我有“markerBitMap.Get(x,y)”,当它应该是markerBitMap.Get(y,x)时。