是这个link的opencv SVM教程的片段。在那段代码中就是这段代码' Mat sampleMat =(Mat_(1,2)<< j,i);'。我不需要使用Mat_模板,而是需要使用常规的Mat对象。我希望有人能告诉我如何将Mat_转换为上一行中的Mat。
我尝试了Mat sampleMat = (Mat(1,2, CV_32FC1) << j,i);
//但却得到了很长的错误
我尝试了Mat sampleMat = Mat(1,2, CV_32FC1) << j,i;
//相同的长页错误
我只需要在页面顶部的链接处运行代码,而无需使用Mat_并仅使用Mat代替...如果有人可以告诉我如何编写该行,我会很感激它
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
{
Mat sampleMat = (Mat_<float>(1,2) << j,i);
float response = SVM.predict(sampleMat);
if (response == 1)
image.at<Vec3b>(i,j) = green;
else if (response == -1)
image.at<Vec3b>(i,j) = blue;
}
编辑:尝试按以下方式运行,但收到错误
Vec3b green(0,255,0), blue (255,0,0);
// Show the decision regions given by the SVM
for (int i = 0; i < image.rows; ++i)
for (int j = 0; j < image.cols; ++j)
{
Mat sampleMat(1, 2, CV_32F);
float * const pmat = sampleMat.ptr<float>();
pmat[0] = i;
pmat[1] = j;
float response = SVM.predict(sampleMat);
if (response == 1)
pmat[0] = green;
pmat[1] = green;
else if (response == -1)
pmat[0] = blue;
pmat[1] = blue;
}
我认为你已经足够了解所以我不需要错误=)
答案 0 :(得分:0)
直接设置值:
Mat sampleMat(1, 2, CV_32F);
sampleMat.at<float>(0,1) = j;
sampleMat.at<float>(0,2) = i;
或
Mat sampleMat(1, 2, CV_32F);
float * const pmat = sampleMat.ptr<float>();
pmat[0] = j;
pmat[1] = i;
附录:
看到你的循环,在SVM.predict
不修改sampleMat
的情况下,你可以提高效率。您可以每行只设置一次图像行,而不是一直这样做:
for (int i = 0; i < image.rows; ++i)
{
Mat sampleMat(1, 2, CV_32F);
sampleMat.at<float>(0, 2) = i;
for (int j = 0; j < image.cols; ++j)
{
sampleMat.at<float>(0, 1) = j;
...
}
}