使用感兴趣区域中的轮廓进行目标检测
object detection with contours in region of interest
我想为对象使用轮廓 detection.I 可以将对象与背景分开。我在 image.I 的中心有一个边界框想要当对象在边界框中时,检测 it.I 使用`
for(int i = 0; i < contours.size(); i++) {
for (int j = 0; j < contours[i].size();j++) {
cout << contours[i][j] << endl;
// ...
显示 i & j.and 中的所有轮廓使用此代码
for(int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++) {
if (contours[i, j] == contours[x, y])
// ...
当我 运行 程序时,为了检测 interest.but 区域中的对象,我的代码已经中断
if (contours[i, j] == contours[x, y])
.你有办法解决我的问题吗?谢谢你的帮助。
`//draw each contour with a random color
int idx = 0;
for (; idx >= 0; idx = hierarchy[idx][0]){ Scalar color(rand() & 255, rand() & 255);
if (contourArea(contours[idx]) < 20)
drawContours(dst2, contours, idx, color, CV_FILLED);}
for (int i = 0; i < contours.size(); i++){
for (int j = 0; j < contours[i].size();j++){
// cout << contours[i][j] << endl;
for (int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++){
if (contours[i][j] == contours[x][y]) {
rectangle(frame, rectangle2, Scalar(255, 255, 255)) }
}
}
}`
我有两个边界框,我希望当对象处于比另一个边界框隐藏更小的边界框中时。
这可能是有问题的代码块。
for (int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++) {
if (contours[i][j] == contours[x][y]) {
rectangle(frame, rectangle2, Scalar(255, 255, 255)) }
}
}
这里有问题的一点是 contours[x][y]
,因为它假定您有(至少)455 个等高线,并且从第 405 个开始的 50 个等高线有(至少)280 个点。这几乎肯定不是你想要做的,并且鉴于你的程序崩溃,这绝对意味着你没有找到足够的轮廓,或者足够长的轮廓来使它有意义。
contours
不是具有 x 和 y 坐标的图像,而是零个或多个边界的列表,其中每个边界都有一定数量的点(大概至少 3 个,但我不知道当然)。 countours[i][j]
没问题,因为您已经检查过 i
和 j
在封闭的 for
循环中是否在边界内。
我无法建议您应该怎么做,因为您的代码有很多印刷错误(并非所有错误都已修复)并且您的问题不清楚。我怀疑您需要从 contours[i][j]
处找到的点开始,看看它是否在您的投资回报率范围内。您不需要遍历 x
和 y
值来执行此操作。
真的,你应该已经通过使用调试器、检查 contours
的实际边界等发现了这一点。我不知道您使用的是什么构建环境和选项,但是当您尝试访问超出容器边界时,其中很多都支持引发有用的调试断言和有意义的异常。您应该使用这些类型的系统来帮助您。您还应该打开更多编译器警告,因为您的代码 乱七八糟 有错误,其中任何一个都可能导致您出现问题,并使诊断此问题变得比需要的更加困难。
我想为对象使用轮廓 detection.I 可以将对象与背景分开。我在 image.I 的中心有一个边界框想要当对象在边界框中时,检测 it.I 使用`
for(int i = 0; i < contours.size(); i++) {
for (int j = 0; j < contours[i].size();j++) {
cout << contours[i][j] << endl;
// ...
显示 i & j.and 中的所有轮廓使用此代码
for(int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++) {
if (contours[i, j] == contours[x, y])
// ...
当我 运行 程序时,为了检测 interest.but 区域中的对象,我的代码已经中断
if (contours[i, j] == contours[x, y])
.你有办法解决我的问题吗?谢谢你的帮助。
`//draw each contour with a random color
int idx = 0;
for (; idx >= 0; idx = hierarchy[idx][0]){ Scalar color(rand() & 255, rand() & 255);
if (contourArea(contours[idx]) < 20)
drawContours(dst2, contours, idx, color, CV_FILLED);}
for (int i = 0; i < contours.size(); i++){
for (int j = 0; j < contours[i].size();j++){
// cout << contours[i][j] << endl;
for (int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++){
if (contours[i][j] == contours[x][y]) {
rectangle(frame, rectangle2, Scalar(255, 255, 255)) }
}
}
}`
我有两个边界框,我希望当对象处于比另一个边界框隐藏更小的边界框中时。
这可能是有问题的代码块。
for (int x = 405; x < 455; x++) {
for (int y = 210; y < 280; y++) {
if (contours[i][j] == contours[x][y]) {
rectangle(frame, rectangle2, Scalar(255, 255, 255)) }
}
}
这里有问题的一点是 contours[x][y]
,因为它假定您有(至少)455 个等高线,并且从第 405 个开始的 50 个等高线有(至少)280 个点。这几乎肯定不是你想要做的,并且鉴于你的程序崩溃,这绝对意味着你没有找到足够的轮廓,或者足够长的轮廓来使它有意义。
contours
不是具有 x 和 y 坐标的图像,而是零个或多个边界的列表,其中每个边界都有一定数量的点(大概至少 3 个,但我不知道当然)。 countours[i][j]
没问题,因为您已经检查过 i
和 j
在封闭的 for
循环中是否在边界内。
我无法建议您应该怎么做,因为您的代码有很多印刷错误(并非所有错误都已修复)并且您的问题不清楚。我怀疑您需要从 contours[i][j]
处找到的点开始,看看它是否在您的投资回报率范围内。您不需要遍历 x
和 y
值来执行此操作。
真的,你应该已经通过使用调试器、检查 contours
的实际边界等发现了这一点。我不知道您使用的是什么构建环境和选项,但是当您尝试访问超出容器边界时,其中很多都支持引发有用的调试断言和有意义的异常。您应该使用这些类型的系统来帮助您。您还应该打开更多编译器警告,因为您的代码 乱七八糟 有错误,其中任何一个都可能导致您出现问题,并使诊断此问题变得比需要的更加困难。