【发布时间】: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