如何使用OpenCV对物体进行搜索检测与识别( 三 )


#include "opencv2/ximgproc/segmentation.hpp"#include "opencv2/highgui.hpp"#include "opencv2/core.hpp"#include "opencv2/imgproc.hpp"#include #include using namespace cv;using namespace cv::ximgproc::segmentation;static void help() {std::cout << std::endl <<"Usage:" << std::endl <<"./ssearch input_image (f|q)" << std::endl <<"f=fast, q=quality" << std::endl <<"Use l to display less rects, m to display more rects, q to quit" << std::endl;}int main(int argc, char** argv) {// If image path and f/q is not passed as command// line arguments, quit and display help messageif (argc < 3) {help();return -1;}// speed-up using multithreadssetUseOptimized(true);setNumThreads(4);// read imageMat im = imread(argv[1]);// resize imageint newHeight = 200;int newWidth = im.cols*newHeight/im.rows;resize(im, im, Size(newWidth, newHeight));// create Selective Search Segmentation Object using default parametersPtr ss = createSelectiveSearchSegmentation();// set input image on which we will run segmentationss->setBaseImage(im);// Switch to fast but low recall Selective Search methodif (argv[2][0] == 'f') {ss->switchToSelectiveSearchFast();}// Switch to high recall but slow Selective Search methodelse if (argv[2][0] == 'q') {ss->switchToSelectiveSearchQuality();} // if argument is neither f nor q print help messageelse {help();return -2;}// run selective search segmentation on input imagestd::vector rects;ss->process(rects);std::cout << "Total Number of Region Proposals: " << rects.size() << std::endl;// number of region proposals to showint numShowRects = 100;// increment to increase/decrease total number// of reason proposals to be shownint increment = 50;while(1) {// create a copy of original imageMat imOut = im.clone();// itereate over all the region proposalsfor(int i = 0; i < rects.size(); i++) {if (i < numShowRects) {rectangle(imOut, rects[i], Scalar(0, 255, 0));}else {break;}}// show outputimshow("Output", imOut);// record key pressint k = waitKey();// m is pressedif (k == 109) {// increase total number of rectangles to show by incrementnumShowRects += increment;}// l is pressedelse if (k == 108 && numShowRects > increment) {// decrease total number of rectangles to show by incrementnumShowRects -= increment;}// q is pressedelse if (k == 113) {break;}}return 0;}
选择性搜索:
下面的代码是使用 3.3进行选择性搜索的教程 。请注意代码块后提到的 3.2的错误警报 。请仔细阅读评论以了解代码 。
#!/usr/bin/env python'''Usage:./ssearch.py input_image (f|q)f=fast, q=qualityUse "l" to display less rects, 'm' to display more rects, "q" to quit.'''import sysimport cv2if __name__ == '__main__':# If image path and f/q is not passed as command# line arguments, quit and display help messageif len(sys.argv) < 3:print(__doc__)sys.exit(1)# speed-up using multithreadscv2.setUseOptimized(True);cv2.setNumThreads(4);# read imageim = cv2.imread(sys.argv[1])# resize imagenewHeight = 200newWidth = int(im.shape[1]*200/im.shape[0])im = cv2.resize(im, (newWidth, newHeight))# create Selective Search Segmentation Object using default parametersss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()# set input image on which we will run segmentationss.setBaseImage(im)# Switch to fast but low recall Selective Search methodif (sys.argv[2] == 'f'):ss.switchToSelectiveSearchFast()# Switch to high recall but slow Selective Search methodelif (sys.argv[2] == 'q'):ss.switchToSelectiveSearchQuality()# if argument is neither f nor q print help messageelse:print(__doc__)sys.exit(1)# run selective search segmentation on input imagerects = ss.process()print('Total Number of Region Proposals: {}'.format(len(rects)))# number of region proposals to shownumShowRects = 100# increment to increase/decrease total number# of reason proposals to be shownincrement = 50while True:# create a copy of original imageimOut = im.copy()# itereate over all the region proposalsfor i, rect in enumerate(rects):# draw rectangle for region proposal till numShowRectsif (i