这可能是一个愚蠢的问题,但我真的无法弄清楚。首先:抱歉标题含糊不清,我不太确定如何用几句话来描述我的问题。
我在 MS Visual Studio、C++ 中使用 OpenCV 2.4.3。我正在使用 VideoCapture 接口从我的笔记本电脑网络摄像头捕获帧。
我的程序应该做的是:
循环用户的不同姿势,对于每个姿势:
- 等待用户就位(getchar() 只需按 Enter 即可等待输入“我就位”的输入)
- 读取当前帧
- 从该帧中提取感兴趣的区域
- 将图像保存在 ROI 中,然后对其进行标记
这是代码:
int main() {
Mat img, face_img, img_start;
Rect *face;
VideoCapture cam(0);
ofstream fout("dataset/dataset.txt");
if(!fout) {
cout<<"Cannot open dataset file! Aborting"<<endl;
return 1;
}
int count = 0; // Number of the (last + 1) image in the dataset
// Orientations are: 0°, +/- 30°, +/- 60°, +/-90°
// Distances are just two, for now
// So it is 7x2 images
cam.read(img_start);
IplImage image = img_start;
face = face_detector(image);
if(!face) {
cout<<"No face detected..? Aborting."<<endl;
return 2;
}
// Double ROI dimensions
face->x = face->x-face->width / 2;
face->y = face->y-face->height / 2;
face->width *= 2;
face->height *=2;
for(unsigned i=0;i<14;++i) {
// Wait for the user to get in position
getchar();
// Get the face ROI
cam.read(img);
face_img = Mat(img, *face);
// Save it
stringstream sstm;
string fname;
sstm << "dataset/image" << (count+i) << ".jpeg";
fname = sstm.str();
imwrite(fname,face_img);
//do some other things..
我对它的期望:
- 程序启动时我站在相机前面,它使用 face_detector() 函数获取 ROI 矩形
- 当我准备好时,比如说在pose0,我按回车并拍照
- 从该图片中提取子图像并将其保存为 image0.jpeg
- 循环这个 7 次
它能做什么:
- 程序开始时我站在镜头前,这里没什么特别的
- 我点击进入
- ROI 不是从那一刻拍摄的照片中提取的,而是从第一张照片中提取的
起初,我在每个 cam.capture() 中都使用了 img,然后我在 cam.capture(img_start) 中更改了第一个,但这并没有帮助。我的代码的第二次迭代保存了应该在第一次保存的图像,第三次迭代保存应该在第二次保存的图像,依此类推。
我可能错过了 VideoCapture 中的一些重要内容,但我真的想不通,所以我来了。
感谢您的帮助,我真的很感激。