我是OpenCV的新手,我想选择视频/图像中的特定区域进行检测。在我的情况下,我想检测只在不在停车场的道路上的汽车。
答案 0 :(得分:8)
那么,选择汽车需要使用培训数据。但选择ROI(感兴趣的区域)非常简单:
考虑img = cv2.imread(image)
在这种情况下,在代码中的某个位置,您可以通过这种方式指定区域:
sub_image = img[y:y+h, x:x+w]
一旦指定值,这将获得ROI,当然,不使用'x'或'y',其中h是高度,w是宽度。请记住,图像只是2D矩阵。
使用CascadeClassifier()
从图像中选择汽车。找到文档here。 OpenCV包含训练数据,您可以使用它们以XML文件的形式进行分类。
答案 1 :(得分:7)
如果您想手动选择感兴趣的区域(ROI)对其进行一些处理,那么您可以尝试使用鼠标点击事件来选择ROI的起点和终点。
一旦有了开始和停止点,就可以使用它从所选区域中检索图像。
可以在图像或捕获视频帧上完成。
bool roi_captured = false;
Point pt1, pt2;
Mat cap_img;
//Callback for mousclick event, the x-y coordinate of mouse button-up and button-down
//are stored in two points pt1, pt2.
void mouse_click(int event, int x, int y, int flags, void *param)
{
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
{
std::cout<<"Mouse Pressed"<<std::endl;
if(!roi_capture)
{
pt1.x = x;
pt1.y = y;
}
else
{
std::cout<<"ROI Already Acquired"<<std::endl;
}
break;
}
case CV_EVENT_LBUTTONUP:
{
if(!got_roi)
{
Mat cl;
std::cout<<"Mouse LBUTTON Released"<<std::endl;
pt2.x = x;
pt2.y = y;
cl = cap_img.clone();
Mat roi(cl, Rect(pt1, pt2));
Mat prev_imgT = roi.clone();
std::cout<<"PT1"<<pt1.x<<", "<<pt1.y<<std::endl;
std::cout<<"PT2"<<pt2.x<<","<<pt2.y<<std::endl;
imshow("Clone",cl);
got_roi = true;
}
else
{
std::cout<<"ROI Already Acquired"<<std::endl;
}
break;
}
}
}
//In main open video and wait for roi event to complete by the use.
// You capture roi in pt1 and pt2 you can use the same coordinates for processing // //subsequent frame
int main(int argc, char *argv[])
{
int frame_num = 0;
int non_decode_frame =0;
int count = 1, idx =0;
int frame_pos =0;
std::cout<<"Video File "<<argv[1]<<std::endl;
cv::VideoCapture input_video(argv[1]);
namedWindow("My_Win",1);
cvSetMouseCallback("My_Win", mouse_click, 0);
sleep(1);
while(input_video.grab())
{
cap_img.release();
if(input_video.retrieve(cap_img))
{
imshow("My_Win", cap_img);
if(!got_roi)
{
//Wait here till user select the desire ROI
waitKey(0);
}
else
{
std::cout<<"Got ROI disp prev and curr image"<<std::endl;
std::cout<<"PT1"<<pt1.x<<" "<<pt1.y<<std::endl;
std::cout<<"PT2"<<pt2.x<<" "<<pt2.y<<std::endl;
Mat curr_img_t1;
Mat roi2(cap_img,Rect(pt1, pt2));
Mat curr_imgT = roi2.clone();
cvtColor(curr_imgT, curr_img_t1, CV_RGB2GRAY);
imshow("curr_img", curr_img);
// Do remaining processing here on capture roi for every frame
waitKey(1);
}
}
}
}
答案 2 :(得分:0)
您没有使用正在编写的编程语言进行标记。无论如何,我用python回答了你。 (如果需要,您可以轻松地将其转换为C ++)
def mouse_drawing(event, x, y, flags, params):
if event == cv2.EVENT_LBUTTONDOWN:
car = img[y: y + carheight, x: x + carwidth]
cv2.imwrite("car", car)
cv2.namedWindow("my_img")
cv2.setMouseCallback("my_img", mouse_drawing)
while True:
cv2.imshow("my_img", img)
key = cv2.waitKey(1)
if key == 27:
break
就像在其他答案中所说的那样,如果您想自动查找汽车,那将是另一个问题,与训练数据和其他事情有关。