【问题标题】:change size of rectangle after object detection物体检测后改变矩形的大小
【发布时间】:2017-06-25 19:38:51
【问题描述】:

我使用下面的代码进行对象检测。

int main(int argc, char* argv[]){
VideoCapture cap(0); 
if (!cap.isOpened()){
    cout << "Cannot open the video cam" << endl;
    return -1;}
int totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT);
Mat frame;
namedWindow("MyVideo", CV_WINDOW_AUTOSIZE);

while (1)
{
    bool bSuccess = cap.read(frame); // read a new frame from video

    if (!bSuccess)
    {
        cout << "Cannot read a frame from video stream" << endl;
        break;
    }
Mat frame2;

Rect rectangle2(420,280, 40, 40);
rectangle(frame, rectangle2, Scalar(255, 255, 255));
Mat cornerstrength;
    cornerHarris(frame, cornerstrength, 3, 3, 0.1);
    //threshold the corner strength
    Mat harriscorners;
    double th = 0.00001;
    threshold(cornerstrength, harriscorners, th, 255, THRESH_BINARY);
    morphologyEx(harriscorners, harriscorners, MORPH_CLOSE, Mat(), Point(-1, -1), 6);
    //local maxima detection
    Mat dilated, localMax;
    dilate(cornerstrength, dilated, Mat());
    compare(cornerstrength, dilated, localMax, CMP_EQ);
    threshold(cornerstrength, harriscorners, th, 255, THRESH_BINARY);
    harriscorners.convertTo(harriscorners, CV_8U);
    bitwise_and(harriscorners, localMax, harriscorners);
    harriscorners.convertTo(harriscorners, CV_32F);
    Mat S(0, 2, CV_32SC1);

    //drawing a circle around corners

    for (int j = 0;j < harriscorners.rows;j++)
        for (int i = 0;i < harriscorners.cols;i++)
        {

            if (harriscorners.at<float>(j, i)> 0)
            {    circle(frame, Point(i, j), 5, Scalar(255), 2, 8);
                Mat pt(1, 2, CV_32SC1);
                pt.at<int>(1, 0) = i;
                pt.at<int>(0, 1) = j;
                // Add the point to S
                S.push_back(pt);
                for (int x = 430; x < 460; x++)
                    for (int y = 285; y < 315; y++)
                        if  ((pt.at<int>(1, 0) = i) == x && (pt.at<int>(0, 1) = j) == y))


                        {
                            Rect rectangle2(430, 285, 30,30);}}}
imshow("MyVideo", frame);
if (waitKey(30) == 27)
                {
                    cout << "esc key is pressed by user" << endl;
                    break;
                }
            }

            return 0;
        }

我想要当条件 if ((pt.at(1, 0) = i) == x && (pt.at(0, 1) = j) == y))建立然后矩形2的大小从 rectangle2(420,280,40,40) 更改为 rectangle2(430,285,30,30)。我可以进行此更改,但是当我使用我的代码时新的矩形2)显示在图片中。但我只想显示新的矩形2。你有什么想法来解决我的问题吗?非常感谢..

【问题讨论】:

  • 代码不完整,但我看到一个错误,frame2 已创建但未初始化。我还看到您使用框架在其上绘制了一个矩形,您应该在对其进行绘画之前保存一个clone()。如果不是,它将始终具有您在其上绘制的矩形。
  • frame2 是一个印刷错误。我在绘制矩形之前使用 Mat f = frame.clone() 保存帧。但是在该循环之后我该怎么做才能只绘制新矩形?
  • 在那个循环之前我想画 (420,280,40,40),在那个循环之后我想画 (430,285,30,30)。
  • 使用框架的克隆,对这个克隆做矩形,对这个克隆做任何你需要做的事情,然后当你想改变矩形时,再次克隆框架并将矩形绘制到这一秒克隆

标签: c++ opencv rectangles


【解决方案1】:

正如我在 cmets 中所说,您需要创建一个克隆并保持帧几乎恒定。

所以,在这部分:

    Rect rectangle2(420,280, 40, 40);
    rectangle(frame, rectangle2, Scalar(255, 255, 255));
    Mat cornerstrength;
    cornerHarris(frame, cornerstrength, 3, 3, 0.1);

写一些类似的东西

    cv::Mat frameCopy = frame.clone();
    Rect rectangle2(420,280, 40, 40);
    rectangle(frameCopy , rectangle2, Scalar(255, 255, 255));
    Mat cornerstrength;
    cornerHarris(frameCopy , cornerstrength, 3, 3, 0.1);

那么,在这部分,我不确定它打算做什么

                for (int x = 430; x < 460; x++)
                    for (int y = 285; y < 315; y++)
                        if  ((pt.at<int>(1, 0) = i) == x && (pt.at<int>(0, 1) = j) == y))    
                        {
                            Rect rectangle2(430, 285, 30,30);
                        }
             }
         }
                            imshow("MyVideo", frame);

但可能你想用一个新的矩形显示新图像,所以你可以再做一次像以前一样的事情:

    cv::Mat anotherCopy= frame.clone();
    Rect rectangleInLoop(430,280,30,30);
    rectangle(anotherCopy, rectangleInLoop, Scalar(255, 255, 255));
    imshow("MyVideo", anotherCopy);

【讨论】:

  • 感谢您的帮助 api55.但是,我在哪里将最后一部分添加到代码中?而我的问题正是当它放置在 (420,280,40,40) 中的对象大于大小时矩形更改为 (430,280,30,30) 并且仅在我的图片中显示 (430,280,30,30)。
  • @louis89 抱歉,我更新了新数字,不清楚 for 循环的用途,因为您只创建矩形(仅在该范围内有效)所以我从代码中删除了 for说清楚,基本上,答案是,不换框架,只复制一份,我做的时候看看clone
  • @louis89 我建议创建一个关于它的新问题。如果这个解决了当前问题,你应该接受答案并投票,这样人们就知道这个解决方案适用于这类问题。创建一个关于自适应阈值的新问题将帮助人们更轻松地找到解决问题的方法。
  • 很遗憾,我无法在窗口中同时绘制两个矩形。但感谢您的帮助 api55
  • @louis89 你要求不要在同一个窗口中绘制两个矩形......我的答案是,在同一个窗口中绘制它们然后在函数矩形中使用相同的框架,它应该同时显示
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多