嗨,我一直在研究这个问题,但却没有很好的解决方案.
我正逐帧阅读视频,并使用背景减法来识别有移动的区域,并使用cvFindContours()来获取移动对象的矩形边界.
假设程序保持简单,那么只有2个人.
这些物体以它们可以重叠的方式移动,以一定的间隔转弯并移开.
我怎样才能正确标记这个人类x 2.
cvFindContour可以以随机方式返回边界.对于Frame1,Frame2,Frame3 ...... FrameN
我最初可以比较矩形边界质心来正确地标记人类.一旦人类重叠并离开,这种方法就会失败.
我试图跟踪原始obj的像素颜色(但是人类非常相似,某些区域有类似的颜色,如手,腿,头发)因此不够好.
我正在考虑使用Image Statistic:
CountNonZero(),SumPixels()Mean()Mean_StdDev()MinMaxLoc()Norm()
唯一地区分这两个对象.我相信这将是一个更好的方法.
我想测试ViBe算法的背景减法.目前我正在使用opencv库.我在opencv/samples/gpu/bgfg_segm.cpp和bgfg_vibe.cpp文件中找到了一个示例实现.这些文件在gpu模块下.现在我有一个没有GPU的系统.当我尝试运行代码时,它会在第一帧的初始化时崩溃.谁能告诉我如何解决这个问题?
提前致谢.
我正在尝试编译http://mateuszstankiewicz.eu/?p=189上的简单示例 我正在运行Ubuntu 12.10 64位.我使用的是OpenCV 2.4.4a
我使用makefile编译,执行此操作:
g++ background_subtraction.cpp -o background_subtraction -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L /usr/local/lib -lm -lopencv_core -lopencv_highgui -lopencv_imgproc -lcvblob
Run Code Online (Sandbox Code Playgroud)
错误:
/tmp/cc0ZWnll.o: dans la fonction « main »:
background_subtraction.cpp:(.text+0x96): référence indéfinie vers « cv::BackgroundSubtractorMOG2::BackgroundSubtractorMOG2() »
background_subtraction.cpp:(.text+0x1f0): référence indéfinie vers « cv::BackgroundSubtractorMOG2::operator()(cv::_InputArray const&, cv::_OutputArray const&, double) »
background_subtraction.cpp:(.text+0x222): référence indéfinie vers « cv::BackgroundSubtractorMOG2::getBackgroundImage(cv::_OutputArray const&) const »
background_subtraction.cpp:(.text+0x61a): référence indéfinie vers « cv::BackgroundSubtractorMOG2::~BackgroundSubtractorMOG2() »
background_subtraction.cpp:(.text+0x7a6): référence indéfinie vers « cv::BackgroundSubtractorMOG2::~BackgroundSubtractorMOG2() »
collect2: erreur: ld a retourné 1 code d'état d'exécution
Run Code Online (Sandbox Code Playgroud)
意思是:未定义引用... …
我在OpenCV中使用BackgroundSubtractorMOG来跟踪对象.当它们出现时,它工作正常,但背景快速适应,所以我无法跟踪静态对象.如何使背景调整变慢(我不希望它完全静态,只是更慢)?
使用构造函数设置学习速率不会改变:
BackgroundSubtractorMOG pBSMOG = BackgroundSubtractorMOG(???);
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?谢谢!
我可以从网络摄像头捕获视频并使用此代码保存
cap = cv2.VideoCapture(0)
fgbg= cv2.BackgroundSubtractorMOG()
fourcc = cv2.cv.CV_FOURCC(*'DIVX')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret,frame = cap.read()
if ret:
fgmask = fgbg.apply(frame)
out.write(frame) #Save it
cv2.imshow('Background Subtraction', fgmask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break #q to quit
else:
break #EOF
cap.release()
out.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
这按照人们的预期记录,并显示背景减法的内容.它将它保存到output.avi.一切都很好.但我无法保存前景蒙版,它给了我一个Could not demultiplex stream错误.(此行在上面的代码中更改).
out.write(fgmask) #Save it
Run Code Online (Sandbox Code Playgroud)
为什么是这样?当我从捕获中读取时,fgmask不是一个框架吗?
我正在使用openCV为我的ios应用程序检测实时摄像机中的移动物体,但我不熟悉openCV的使用请帮助我.任何其他方式也欢迎.
- (void)viewDidLoad {
[super viewDidLoad];
self.videoCamera.delegate = self;
self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.view];
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
self.videoCamera.grayscaleMode = NO;
[self.videoCamera start];
// cv::BackgroundSubtractorMOG2 bg;
}
- (void)processImage:(cv::Mat&)image
{
//process here
cv::cvtColor(image, img, cv::COLOR_BGRA2RGB);
int fixedWidth = 270;
cv::resize(img, img, cv::Size(fixedWidth,(int)((fixedWidth*1.0f)* (image.rows/(image.cols*1.0f)))),cv::INTER_NEAREST);
//update the model
bg_model->operator()(img, fgmask, update_bg_model ? -1 : 0);
GaussianBlur(fgmask, fgmask, cv::Size(7, 7), 2.5, 2.5);
threshold(fgmask, fgmask, 10, 255, cv::THRESH_BINARY);
image = cv::Scalar::all(0);
img.copyTo(image, fgmask);
}
Run Code Online (Sandbox Code Playgroud)
我是openCV的新手,所以我不知道该怎么办.
我想在静态背景中提取单独移动人的前景蒙版.如何在open-CV java中实现这个?
package com.java.opencv;
import org.opencv.core.Mat;
import org.opencv.video.BackgroundSubtractor;
import org.opencv.video.BackgroundSubtractorMOG2;
import org.opencv.videoio.VideoCapture;
public class HelloCV {
public static void main(String[] args){
VideoCapture capture = new VideoCapture(0);
Mat camImage = new Mat();
BackgroundSubtractorMOG2 backgroundSubtractorMOG=new BackgroundSubtractorMOG2();
if (capture.isOpened()) {
while (true) {
capture.read(camImage);
Mat fgMask=new Mat();
backgroundSubtractorMOG.apply(camImage, fgMask,0.1);
Mat output=new Mat();
camImage.copyTo(output,fgMask);
//displayImageOnScreen(output);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这一行得到一个错误.
BackgroundSubtractorMOG2 backgroundSubtractorMOG=new BackgroundSubtractorMOG2();
Run Code Online (Sandbox Code Playgroud)
构造函数BackgroundSubtractorMOG2()未定义
找不到这些方法的适当文档
我使用OpenCV进行前景检测,但我有一个问题,如果有人可以提供帮助.问题在于以下两个参数:
bst.apply(currentFame, foregroungMask, learnRate); // -1 for auto, and the range is 0~1bst.setBackgroundRatio(double ratio) // default is 0.8xxx问题是这两个参数是否相同,如果答案是NO那么第二个参数可以做什么?
当我看到课堂setBackgroundRatio(double ratio)上没有这种方法时,问题就出现了BackgroundSubtractorKNN,但它只是在BackgroundSubtractorMOG2课堂上.但它们都有方法中的学习率参数apply().
注意:我在Java中使用OpenCV
我有一组图像,所有这些图像看起来几乎都像这里的这片叶子:
我想从背景中提取叶子,为此我使用了此处GrabCut使用的算法。
作为一种不同的方法,我还使用基于 r、g 和 b 值比率的阈值,如下所示:
import numpy as np
import cv2
import matplotlib.pyplot as plt
testImg = cv2.imread('path_to_the_image')
testImg = cv2.resize(testImg, (256, 256))
#bgImg = cv2.imread('')
#blurBg = cv2.GaussianBlur(bgImg, (5, 5), 0)
#blurBg = cv2.resize(blurBg, (256, 256))
#testImg = cv2.GaussianBlur(testImg, (5, 5), 0)
cv2.imshow('testImg', testImg)
#plt.imshow(bgImg)
cv2.waitKey(0)
#plt.show()
modiImg = testImg.copy()
ht, wd = modiImg.shape[:2]
print(modiImg[0][0][0])
for i in range(ht):
for j in range(wd):
r = modiImg[i][j][0]
g = modiImg[i][j][1]
b = modiImg[i][j][2]
r1 = …Run Code Online (Sandbox Code Playgroud) python opencv image-processing python-3.x background-subtraction