当前位置: 首页 > 工具软件 > rowy > 使用案例 >

关于Mat Mat::row(int y) const { return Mat(*this, Range(y, y + 1), Range::all()); }运行中断

柴宝
2023-12-01

这几天写代码碰到了

Mat Mat::row(int y) const
{
	 return Mat(*this, Range(y, y + 1), Range::all());
}

运行中断,
说实话一开始确实有点头疼,当然,现在问题解决了,就把我遇到问题写在这里,希望能给你们带来点帮助。
首先,这个问题我是在用opencv新出的onnx做东西时碰到的,当时我试图将打开摄像头拍下的那一帧图片作为人脸识别的比对原图。

//人脸识别资料库结构体
struct face_identify
{
char name[30];
cv::Mat goal;
cv::Mat goal_face;
cv::Mat goal_face_align;
cv::Mat goal_face_feature;
};


//人脸识别目标资料库,100为最大容量人数
face_identify all_people[100];

// 需要输入人脸资料库的人脸数
int people;

先弄了一个结构体和一些其他的东西,然后通过黑窗口输入人脸数people,并打开摄像头拍下一帧图片载入到all_people[p].goal里,然后问题就出在了这里,当时我以为图片已经载入到all_people[p].goal里了,然而它并没有,它只是在那个步骤创建了一个空的cv::Mat,里面什么都没,一直运行到下面那堆代码
faceRecognizer->alignCrop(all_people[p].goal, all_people[p].goal_face.row(0), all_people[p].goal_face_align);
处才运行中断,显示的就是
Mat Mat::row(int y) const
{
return Mat(*this, Range(y, y + 1), Range::all());
}
了。

//目标图片载入
for (int p = 0; p < people; p++)
{
	detector = cv::FaceDetectorYN::create(modelPath, "", all_people[p].goal.size(), scoreThreshold, nmsThreshold, topK, backendId, targetId);
	//检测出的人脸方框
	//cv::Mat goal_img_faces;
	//人脸识别--目标人物图像处理
	// 重新设置尺寸
	detector->setInputSize(all_people[p].goal.size());
	//检测
	detector->detect(all_people[p].goal, all_people[p].goal_face);
	//目标图片
	//cv::Mat aligned_face2;
	faceRecognizer->alignCrop(all_people[p].goal, all_people[p].goal_face.row(0), all_people[p].goal_face_align);
	//Mat  feature2;
	//Mat feature1, feature2;
	//faceRecognizer->feature(aligned_face1, feature1);
	//feature1 = feature1.clone();
	faceRecognizer->feature(all_people[p].goal_face_align, all_people[p].goal_face_feature);
	all_people[p].goal_face_feature = all_people[p].goal_face_feature.clone();
}

当时我的解决方法就是修改了摄像头拍下一帧图片载入到all_people[p].goal那一步,确保它能准确地载入图片,改完后就可以正常运行了。

当然,因为每个人写代码时碰到的问题都不一样,所以我最后还是简单的介绍一下,一般来说,你碰到

Mat Mat::row(int y) const
{
	 return Mat(*this, Range(y, y + 1), Range::all());
}

运行中断这种问题的话,那你十有八九是.row(0)的使用有误,别的情况我可能不大清楚,但如果你使用了int cv::FaceDetectorYN::detect(cv::InputArrary image,cv::OutputArray faces)的话,也就是类似下面的这句代码

cv::String modelPath = "D:\\OpenCV\\libfacedetection\\libfacedetection.train-master\\libfacedetection.train-master\\tasks\\task1\\onnx\\yunet.onnx";
detector = cv::FaceDetectorYN::create(modelPath, "", all_people[p].goal.size(), scoreThreshold, nmsThreshold, topK, backendId, targetId);
	
	//人脸识别--目标人物图像处理
	// 重新设置尺寸
	detector->setInputSize(all_people[p].goal.size());
	//检测
	detector->detect(all_people[p].goal, all_people[p].goal_face);

重点是这句

detector->detect(all_people[p].goal, all_people[p].goal_face);

那么你的all_people[p].goal_face.row(0)指的就是该图片中检测出的第一个人脸图片的高,all_people[p].goal_face.row(i)指的就是该图片中检测出的第i+1个人脸图片的高。
即如果all_people[p].goal这张图片中有i+1张人脸,那么all_people[p].goal_face.row(i)中括号里的数字最大就是i。

顺便提一下,在这种情况下,如果你想知道那张图片里究竟有多少张人脸,建议用all_people[p].goal_face.rows,它指的就是该图片里的人脸数,是一个int值。

注意:记得检查你的Mat是不是只创建却没有内容,或者你用的.row(i)是否指向一个空。

差不多就是这些了,希望对你们有用,毕竟我会的也不多。

 类似资料: