Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于感兴趣区域轮廓的目标检测_C++_Opencv_Opencv Contour - Fatal编程技术网

C++ 基于感兴趣区域轮廓的目标检测

C++ 基于感兴趣区域轮廓的目标检测,c++,opencv,opencv-contour,C++,Opencv,Opencv Contour,我想用轮廓来检测物体。我可以把物体从背景中分离出来。我在图像的中心有一个边界框。我想当物体在边界框中时,检测它。我使用` 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

我想用轮廓来检测物体。我可以把物体从背景中分离出来。我在图像的中心有一个边界框。我想当物体在边界框中时,检测它。我使用`

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])
        // ...

我有两个边界框,我想在对象位于比另一个边界框更小的边界框时隐藏。这可能是错误的代码块

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])
        // ...
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++){
对于(int y=210;y<280;y++){
如果(等高线[i][j]==等高线[x][y]){
矩形(帧,矩形2,标量(255,255,255))}
}
} 
这其中有问题的一点是等高线[x][y],因为它假设您有(至少)455条等高线,并且从第405条开始的50条等高线有(至少)280个点。这几乎肯定不是您想要做的,并且考虑到您的程序崩溃,这肯定意味着您没有找到足够的轮廓,或者没有足够长的轮廓来解释这一点

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])
        // ...
等高线
不是一个具有x和y坐标的图像,而是一个包含零个或多个边界的列表,其中每个边界都有一定数量的点(可能至少有3个,但我不确定)
countours[i][j]
没有问题,因为您已经检查了
i
j
是否在循环的封闭
中的范围内

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])
        // ...
我不能建议你应该怎么做,因为你的代码有很多排版错误(不是所有你已经修复的错误),你的问题也不清楚。我想您需要从
轮廓[I][j]
上找到的点开始,看看它是否在您的ROI范围内。执行此操作不需要循环使用
x
y

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])
        // ...

实际上,您应该已经通过使用调试器、检查
等高线的实际边界等方法发现了这一点。我不知道您使用的是什么构建环境和选项,但是当您尝试访问容器边界外时,它们中的很多都支持引发有用的调试断言和有意义的异常。你应该使用这些系统来帮助你。您还应该打开更多的编译器警告,因为您的代码中到处都是错误,其中任何一个错误都可能导致您出现问题,并使诊断此问题变得更加困难。

是否应该是
等高线[i][j]==等高线[x][y]
?我对此进行了测试,但结果没有变化。您可以发布错误吗?没有错误。我的程序生成成功,但运行时,代码执行停止。请小心C++的错误<代码>轮廓[i,j]
几乎肯定不会像你认为的那样。回答很好。你是对的。非常感谢。但是如果我使用HarrisCorner进行对象检测,我能检测出感兴趣区域中的对象吗?如果不知道更多关于你正在处理的图像和你试图检测的对象的信息,我不能说。当然,在很多情况下,角点检测器可以提供帮助。我试图检测的对象与背景存在差异。例如,我的对象比背景亮或暗,并且对象的大小在某些背景下不是很模糊,例如有很多噪音的背景或其他你不关心的项目,你会发现拐角检测器会有很多响应,其中大部分是你不想要的。您需要将它与其他一些描述对象的方法结合起来(这同样取决于该对象的性质)。
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])
        // ...