我在Processing中编写视频跟踪程序。 有人知道为什么我在将int numberofblobs增加1时收到一个空指针异常。初始值是两个。
这是提供一些上下文的整个代码。我已经清理了大多数无关紧要的东西。
int numberofblobs;
void setup()
{
numberofblobs = 2;
// Size of applet
size(640, 480);
// BlobDetection
// img which will be sent to detection (a smaller copy of the cam frame);
img = new PImage(80, 60);
theBlobDetection = new BlobDetection(img.width, img.height);
theBlobDetection.setPosDiscrimination(false);
theBlobDetection.setThreshold(0.9f); // will detect bright areas whose luminosity > 0.2f;
}
// ==================================================
// captureEvent()
// ==================================================
void captureEvent(Capture cam)
{
cam.read();
newFrame = true;
}
// ==================================================
// draw()
// ==================================================
void draw()
{
if (!starttracking) {
for (int i = 0; i<10; i++) {
if (UNLOCKED[i])
starttracking = true;
}
}
if (newFrame)
{
newFrame=false;
image(cam, 0, 0, width, height);
img.copy(cam, 0, 0, cam.width, cam.height,
0, 0, img.width, img.height);
theBlobDetection.computeBlobs(img.pixels);
//if (starttracking) {
locateBlobs();
//}
}
println("numberofblobs:");
println(numberofblobs);
}
// ==================================================
// locateBlobs()
// ==================================================
void locateBlobs()
{
noFill();
Blob b;
for (int n=0; n<theBlobDetection.getBlobNb (); n++)
{
b=theBlobDetection.getBlob(n);
if (n<numberofblobs) {
println(n);
vectors[n].x = b.xMin*width;
vectors[n].y = b.yMin*height;
println(n);
// Blobs
strokeWeight(1);
stroke(255, 0, 0);
ellipse(
vectors[n].x, vectors[n].y, 80, 80 //b.xMin*width-(b.w*width),b.yMin*height-(b.h*height),30,30
);
}
}
}
void keyPressed() {
if (key =='1') {
if (!UNLOCKED[0]) {
numberofblobs++;
}
UNLOCKED[0]=true;
} else if (key =='2') {
if (!UNLOCKED[1]) {
numberofblobs++;
}
}
}
抛出错误(在LocateBlobs()
中):
vectors[n].x = b.xMin*width;
在尝试进一步缩小范围时,我立即得到空指针异常,而不增加numberofblobs int。 突出显示的行仍然相同。
这是进一步简化的代码:
int numberofblobs;
PVector[] vectors = new PVector[10];
void setup()
{
numberofblobs = 2; // max 10
// Size of applet
size(640, 480);
}
void draw()
{
println("numberofblobs:"); println(numberofblobs);
locateBlobs();
}
void locateBlobs()
{
noFill();
for (int n=0; n<10; n++)
{
// b=theBlobDetection.getBlob(n);
int i = n;
if (n<numberofblobs) {
println(n);
vectors[n].x = 10;
vectors[n].y = 10;
strokeWeight(1);
stroke(255, 0, 0);
//ellipse(
//vectors[n].x, vectors[n].y, 80, 80);
}
}
}
void keyPressed() {
if (key =='1') {
numberofblobs++;
}
}
答案 0 :(得分:0)
在显示的代码中,您没有创建PVector
。除非它们是在其他地方创建的,否则这可能是让你获得NPE的原因。
PVector是一个对象,您需要在访问其字段之前创建它们。
在:
PVector[] vectors = new PVector[10];
您创建了包含10个null
“对象”的PVector类型的数组。但根本没有PVector。
你应该做
for(int i = 0; i< vectors.length; i++){
vectors[i] = new PVector();
}
尚未设置。
然后你可以稍后做:
vectors[n].x = 10;
或者你可以在locateBlobs func中创建它们,例如:
if (n<numberofblobs) {
vectors[n] = new PVector(10,10);
// blah :)
}
注意:所有代码未经测试
HTH
答案 1 :(得分:0)
感谢上一个回答,我发现了问题。
在for循环中,创建我的Pvectors我使用numberofblobs作为约束。这样,如果numberofblobs增加,则可用的矢量太少。
所以最初:
for(int i = 0; i< numberofblobs; i++){
vectors[i] = new PVector();
}
应该是
for(int i = 0; i< maxnumberofblobs; i++){
vectors[i] = new PVector();
}