我仍然是OpenCV的新手,我刚刚遇到了HoughLinesP功能。首先,我的目标是编写能够检测网络摄像头中矩形的代码。目前,我下面的代码一般只检测行。但是,我在调试程序时仍然遇到问题。这是我的代码:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main() {
int erosion_size = 0;
VideoCapture cam(0);
if (!cam.isOpened()) {
cout << "cannot open camera";
}
while (true) {
Mat frame;
cam.read(frame);
Mat gray, edge, draw, die;
cvtColor(frame, gray, CV_BGR2GRAY);
Canny(gray, edge, 100, 150, 3);
edge.convertTo(draw, CV_8U);
dilate(draw, die, Mat(), Point(-1, -1), 2, 1, 1);
erode(die, die, Mat(), Point(-1, -1), 1, 1, 1);
#if 0
vector<Vec2f> lines;
HoughLines(die, lines, 1, CV_PI / 180, 100, 0, 0);
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(frame, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
}
#else
vector<Vec4i> lines;
HoughLinesP(die, lines, 1, CV_PI / 180, 200, 50, 10);
for (size_t i = 0; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(frame, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, CV_AA);
}
#endif
imshow("Canny", die);
imshow("original", frame);
if (waitKey(30) >= 0)
break;
}
return 0;
}
当我调试程序时,网络摄像头弹出正常,但当我显示带有线条(纸张)的矩形对象时,它会以断点错误停止程序。我得出结论,我的程序每次找到一条线就停止了。当我选择继续而不是破坏时,它会给我这个错误:
Debug Assertion failed!
Program: ....Studio
2013/Projects/TrialRectangle/Debug/TrialRectangle.exe
File: f:/dd/vctools/crt/crtw32/misc/dbgheap.c
Line: 1332
Expression: _CrtIsValidHeapPointer(pUserData)
我玩了HoughLinesP函数,发现一个高阈值参数(例如500)似乎使我的程序运行良好但是它在我的网络摄像头中根本没有显示任何HoughLines。如果有人可以解释为什么会这样,那也会有所帮助!
有没有人对如何解决此断点错误有任何想法?
答案 0 :(得分:0)
我也进入了这个Debug Assertion。
在我的情况下,这是因为我的项目是静态编译的,但我使用它的dll动态地使用了OpenCV。所以我将我的项目改为动态编译,解决问题。
这是因为OpenCV对象分配在不同的堆中。当这个对象被破坏时,当前的运行时可以找到该堆,这就是Assertion被击中的原因。