【发布时间】:2015-10-27 23:40:36
【问题描述】:
我的代码使用 OPENCV 进行图像处理,我想随机创建一组白色点的特征。程序在运行内部 WHILE LOOP SECOND TIME 时导致 Assertion failed 错误。我已经对该程序进行了评论和测试,以找出问题所在。我发现 image.at(b,a) 部分代码存在问题。第二次运行失败。虽然它第一次运行得非常好。
如果我在内部 while 循环中使用常量值而不是变量 b,a 运行代码,或者使用 (j,j) 变量运行代码。我用 fout 打印了一些调试语句。我还附上了 .txt 文件输出以帮助您了解正在发生的事情。
从 TXT 文件开始输出
while 循环的开始
在while循环中
在while循环之外
[255, 255, 255]404 1173 while循环开始
在while循环中
TXT 文件输出结束
很奇怪。请帮我解决这个问题! 我正在粘贴我的代码:
int main() {
int i = 0;
int a;
ofstream fout("test.txt");
int b;
int j = 0;
cv::Mat img;
cv::Scalar* scalar_low;
cv::Scalar* scalar_up;
cv::Mat newimg;
cv::Mat img2;
stringstream ss;
string s;
scalar_low = new cv::Scalar(0, 30, 60);
scalar_up = new cv::Scalar(20, 150, 255);
int imgwidth;
int imgheight;
srand(112);
while (j <= 45)
{
s="imagedata\\test"+ to_string(j);
s+=".jpg";
img=imread(s);
cvtColor(img, img2, CV_BGR2HSV, 0);
inRange(img2, *scalar_low, *scalar_up, newimg);
s="imagedata\\result"+ to_string(j);
s+=".jpg";
imwrite(s, newimg);
imgwidth = newimg.cols;
imgheight = newimg.rows;
i = 0;
while (i <= 499)
{
a = 0;
b = 0;
fout << "start of while loop \n";
while ((newimg.at<Vec3b>(b,a) == Vec3b(0,0,0)))
{
fout << "inside the while loop \n"
a = rand() % imgwidth;
b = rand() % imgheight;
}
fout << "outside the while loop \n";
fout << a;
fout << " ";
fout << b;
fout << " ";
i++;
}
j++;
fout << "\n";
}
}
【问题讨论】:
-
您到底想达到什么目的?做“imgwidth = newimg.cols; imgheight = newimg.rows;”你应该没事。还可以阅读一些 C++ 教程并了解为什么你不需要指针,新的,“->”在这里
-
正如@Miki 所说,宽度应对应于列数,高度应对应于行数。也许您对 x/y 排序和矩阵访问感到困惑。查看stackoverflow.com/questions/25642532/… 以获得可能的解释。
-
我尝试了您的建议,但代码仍然无法正常工作。我修改了我的问题并包含了打印到 .txt 文件中的调试语句。
-
您到底想达到什么目的?幻数上的两个while循环不是最佳选择:D
-
@Miki 我正在尝试从过滤后的图像中构建一个随机特征点集,这些点是白色的。这需要我随机生成点并检查它们是否是白色的......