Пример #1
0
int ImgDataTEST::T_getWidth() {
	int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing getWidth():");
    logger->trace(" Init 10x2 Mat obj...");
	cv::Mat img = cv::Mat::eye(10,2,CV_32F);
    logger->trace(" Creating ImgData obj...");
    ImgData* data = new ImgData("data",img);
    logger->trace(" Using getWidth()...");
    logger->trace("    "+StringTools::intToStr(data->getWidth()));
	if (data->getWidth() == 2)
        logger->trace("    ok");
	else {
        logger->warn("    NOT ok, width incorrect");
		fail += 1;
	}
    logger->trace("Test complete.");
    logger->trace("Deleting data...");
	delete data;

	if (fail > 0)
        logger->warn("  TEST FAILED: getWidth()");
    logger->trace("==============================");
	return fail;
}
Пример #2
0
std::vector<cv::Point2f> ShapeFilter::findMassCenter(Data *data){
    // check for whether the input is of the correct type.          From Albert
    ImgData* imgData = dynamic_cast<ImgData*>(data);
    if (imgData == 0) {
        std::vector<cv::Point2f> bad;
        return bad;
    }
    return findMassCenter(imgData->getImg());
}
Пример #3
0
int FilterManagerTEST::T_applyFilterChain() {
    int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing applyFilterChain():");
    logger->trace(" Creating FM under normal mode...");
    FilterManager* fm = new FilterManager("fm");
    logger->trace(" Using factory, making 4 random filters...");
    Filter* f1,*f2,*f3,*f4;
    f1 = FilterFactory::createFilter();
    f2 = FilterFactory::createNullImgFilter();
    f3 = FilterFactory::createNullFPGAFilter();
    f4 = FilterFactory::createFilter();
    logger->trace(" Inserting f1 as \"task 3\" to FRONT...");
    fm->insertFilter("task 3",f1,"FRONT");
    logger->trace(" Inserting f2 as \"task 1\"...");
    fm->insertFilter("task 1",f2,"task 3");
    logger->trace(" Inserting f3 as \"task 2\" between f1,f2...");
    fm->insertFilter("task 2",f3,"task 3");
    logger->trace(" Inserting f4 as \"task 4\" to REAR...");
    fm->insertFilter("task 4",f4);
    logger->trace(" Making img objs...");
    cv::Mat img = cv::Mat::zeros(2,2,CV_8UC1);
    ImgData* data = new ImgData("input",img);
    logger->trace(" Applying all filters...");
    int res = fm->applyFilterChain(data);
    logger->trace("  Checking data ID...");
    logger->trace("    "+data->getID());
    if (data->getID() == "fm")
        logger->trace("    ok");
    else {
        logger->warn("    NOT ok, ID not set!");
        fail++;
    }
    logger->trace("    "+data->getTrack()+"error code "+std::to_string(res));
    if (data->getTrack() == "task 1; task 2-1; task 3; task 4; ")
        if (res == 1)
            logger->trace("    ok");
        else {
            logger->warn("    NOT ok, error code incorrect");
        }
    else {
        logger->warn("    NOT ok, track record not expected");
    }
    img.release();
    delete data;
    delete fm;
    logger->trace("Testing complete.");

    if (fail > 0)
        logger->warn("  TEST FAILED: applyFilterChain");
    logger->trace("==============================");
    return fail;
}
Пример #4
0
int ImgDataTEST::T_Constructor() {
	int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing Constructor:");
    logger->trace(" Init Mat obj using camCap()...");
    logger->trace(" Showing capped img...");
	cv::Mat img = ImgDataTEST::camCap();
    logger->trace(" Constructing new ImgData obj with arg \"data\" and Mat obj...");
    ImgData* data = new ImgData("data", img);
    logger->trace(" Complete.");
    logger->trace(" Checking initialized variables...");
    logger->trace("  Using getID()...");
	if (data->getID() == "data")
        logger->trace("    ok");
	else {
        logger->warn("    NOT ok, ID initialization incorrect");
		fail += 1;
	}
    logger->trace("  Using showImg()...");
    logger->trace("  If both imgs are identical press spacebar, else press esc...");
	data->showImg();
	char key;
	while (1) {
 		key = cvWaitKey(0);
		if (char(key) == 32) {
            logger->trace("    ok");
			break;
		}
		else if (char(key) == 27) {
            logger->warn("    NOT ok, img not same");
			fail++;
			break;
		}
	}
//	logger->trace(" Using getImg() and comparing...");
	//TODO
    logger->trace("Test complete.");
    logger->trace("Closing windows...");
	data->closeImg();
	cvDestroyWindow("camCap");
    logger->trace("Deleting data...");
	delete data;

	if (fail > 0)
        logger->warn("  TEST FAILED: Data Constructor");
    logger->trace("==============================");
	return fail;
}
Пример #5
0
//--------------------------------------------------------------
void ContentElement::setElemTranslation(float x, float y, float z) throw (runtime_error) {
    float offX = 0, offY = 0, offZ = 0;
    if (typeData != NULL) {
        if (type == VID) {
            VidData* vidElem = (VidData*)typeData;
            offX = - (vidElem->getWidth()  / 2) * elemScale;
            offY = - (vidElem->getHeight() / 2) * elemScale;
        } else if (type == IMG) {
            ImgData* imgElem = (ImgData*)typeData;
            offX = - (imgElem->getWidth()  / 2) * elemScale;
            offY = - (imgElem->getHeight() / 2) * elemScale;
        }
    } else {
        throw runtime_error("Set type data object before element translation.");
    }
    
    elemTrans[0] = x + offX;
    elemTrans[1] = y + offY;
    elemTrans[2] = z + offZ;
}
Пример #6
0
bool ShapeFilter::filter(Data *data){
    // check for whether the input is of the correct type.          From Albert
    ImgData* imgData = dynamic_cast<ImgData*>(data);
    if (imgData == 0) {
        // track the error and return error
        this->track(data,this->filterID,1,1);
        return false;
    }

   //beging filtering process
    if (shape == 1){        ///rectangle
        return this->findRect((imgData->getImg()));   //lazy to copy+paste everything
    }else if (shape == 2){  ///circle
        return this->findCirc(imgData->getImg());
    }
    //ending filtering process

    //track and return
    this->track(imgData, this->filterID, 0,0);
    return true;
}
Пример #7
0
int ImgDataTEST::T_cpConstructor() {
	int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing Copy Constructor:");
    logger->trace(" Using camCap() to get Mat obj...");
	cv::Mat img = ImgDataTEST::camCap();
	cvDestroyWindow("camCap");
    logger->trace(" Constructing new ImgData obj with arg \"data\" and Mat obj...");
    ImgData* data = new ImgData("data",img);
    logger->trace(" Setting Msg to \"SubZero rox\"...");
	data->setMsg("SubZero rox");
    logger->trace(" Invoking Copy Constructor...");
    ImgData* copy = new ImgData(*data);
    logger->trace(" Checking variables...");
    logger->trace("  Using getID()...");
	if (copy->getID() == "data")
        logger->trace("    ok");
	else {
        logger->warn("    NOT ok, ID copy incorrect");
		fail += 1;
	}
    logger->trace("  Using getMsg()...");
	if (copy->getMsg() == "SubZero rox")
        logger->trace("    ok");
	else {
        logger->warn("    NOT ok, Msg copy incorrect");
		fail += 1;
	}
    logger->trace("  Showing imgs using showImg()...");
    logger->trace("  If both imgs are identical press spacebar, else press esc...");
	data->showImg("data");
	copy->showImg("copy");
	char key;
	while (1) {
		key = cvWaitKey(0);
		if (char(key) == 32) {
            logger->trace("    ok");
			break;
		}
		else if (char(key) == 27) {
            logger->warn("    NOT ok, img not same");
			fail++;
			break;
		}
	}

    logger->trace(" Changing msg of copy to \"whatever\"...");
	copy->setMsg("whatever");

//	logger->trace(" Changing org img content...");
//	data->closeImg();
//	copy->closeImg();
//	img = ImgDataTEST::camCap();
//	cvDestroyWindow("camCap");
//	data->setImg(&img);

    logger->trace(" Checking variables...");
    logger->trace("  Using getMsg() on original...");
	if (copy->getMsg() == "whatever" && data->getMsg() == "SubZero rox")
        logger->trace("    ok");
	else {
        logger->warn("    NOT ok, org or copy Msg incorrect");
		fail += 1;
	}
    logger->trace(" Using refcount to check independence...");
	int datarc, copyrc;
    datarc = data->img.u->refcount;
    copyrc = copy->img.u->refcount;
    logger->trace("    \"data\" img refcount: "+StringTools::intToStr(datarc));
    logger->trace("    \"copy\" img refcount: "+StringTools::intToStr(copyrc));
	if (datarc==2 && copyrc ==1) {
        logger->trace("    ok");
		fail--;
	}
	else if (datarc==3)
        logger->warn("    NOT ok, copy's img points to data's img obj");
	else
        logger->warn("    NOT ok, data ref should be 2, copy ref should be 1");
	fail++;
//	logger->trace("  Showing imgs using showImg()...");
//	data->showImg("data");
//	copy->showImg("copy");
//	logger->trace("  If copy different from data then deep copy ok press spacebar, else press esc...");
//	while (1) {
//		key = cvWaitKey(0);
//		if (char(key) == 32) {
//			logger->trace("    ok");
//			break;
//		}
//		else if (char(key) == 27) {
//			logger->warn("    NOT ok, img not same");
//			fail++;
//			break;
//		}
//	}
    logger->trace("Test complete.");
    logger->trace("Deleting data...");
	delete data;
	delete copy;

	if (fail > 0)
        logger->warn("  TEST FAILED: ImgData Copy Constructor");
    logger->trace("==============================");
	return fail;
}
Пример #8
0
int ImgDataTEST::T_setImg() {
	int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing setImg():");
    logger->trace(" Creating 2 Mat obj using camCap()...");
    cv::Mat test = camCap();
    cvDestroyWindow("camCap");
    cv::Mat test2 = camCap();
    cvDestroyWindow("camCap");
    cv::namedWindow("obj 1");
    cv::imshow("obj 1",test);
    cv::namedWindow("obj 2");
    cv::imshow("obj 2",test2);
    logger->trace("  Accessing refcount...");
    int t1rc,t2rc,imgrc;
    t1rc = test.u->refcount;
    t2rc = test2.u->refcount;
    logger->trace("    Obj 1 refcount: "+StringTools::intToStr(t1rc));
    logger->trace("    Obj 2 refcount: "+StringTools::intToStr(t2rc));
    if (t1rc+t2rc==2)
        logger->trace("    ok");
    else {
        logger->warn("    NOT ok, refcount should be 1 for both");
    	fail++;
    }
    logger->trace(" Creating ImgData with obj 1...");
    ImgData* testImg = new ImgData("plswork", test);
    logger->trace("  Accessing refcount...");
    t1rc = test.u->refcount;
    t2rc = test2.u->refcount;
    imgrc = testImg->img.u->refcount;
    logger->trace("    Obj 1 refcount: "+StringTools::intToStr(t1rc));
    logger->trace("    Obj 2 refcount: "+StringTools::intToStr(t2rc));
    if (t1rc == 2) {
    	if (imgrc == 2) {
    		if(t2rc == 1)
                logger->trace("    ok");
    		else {
                logger->warn("    NOT ok, obj 2 refcount should be 1");
    			fail++;
    		}
    	}
    	else {
            logger->warn("    NOT ok, obj 1 refcount disagree");
    		fail++;
    	}
    } else {
        logger->warn("    NOT ok, obj 1 refcount should be 2");
    	fail++;
    }
    logger->trace(" Try showImg(), expect photo to be as same as obj 1...");
    logger->trace(" If true, hit space, else hit esc...");
    testImg->showImg();
    char key;
    while (1) {
    	key = cvWaitKey(0);
    	if (char(key) == 32) {
            logger->trace("    ok");
    		break;
    	}
    	else if (char(key) == 27) {
            logger->warn("    NOT ok, img not expected");
    		fail++;
    		break;
    	}
    }
    logger->trace(" Setting obj 2 to img...");
    testImg->setImg(test2);
    logger->trace("  Accessing refcount...");
    t1rc = test.u->refcount;
    t2rc = test2.u->refcount;
    logger->trace("    Obj 1 refcount: "+StringTools::intToStr(t1rc));
    logger->trace("    Obj 2 refcount: "+StringTools::intToStr(t2rc));
    if (t1rc==1 && t2rc==2)
        logger->trace("    ok");
    else {
        logger->warn("    NOT ok, refcount should be 1 for obj 1 and 2 for obj 2");
    	fail++;
    }
    logger->trace(" Release obj 2 from outside ImgData...");
    test2.release();
    logger->trace(" Try showImg(), expect photo to be as same as obj 2...");
    testImg->showImg();
    logger->trace(" If true, hit space, else hit esc...");
    while (1) {
    	key = cvWaitKey(0);
    	if (char(key) == 32) {
            logger->trace("    ok");
    		break;
    	}
    	else if (char(key) == 27) {
            logger->warn("    NOT ok, img not expected");
    		fail++;
    		break;
    	}
    }
    logger->trace("  Accessing refcount...");
    t1rc = test.u->refcount;
    imgrc = testImg->img.u->refcount;
    logger->trace("    Obj 1 refcount: "+StringTools::intToStr(t1rc));
    logger->trace("    Obj 2 refcount: "+StringTools::intToStr(imgrc));
    if (t1rc+imgrc==2)
        logger->trace("    ok");
    else {
        logger->warn("    NOT ok, refcount should be 1 for both");
    	fail++;
    }
    logger->trace(" Deleting ImgData...");
    delete testImg;
    logger->trace(" Release obj 1...");
    test.release();
    cv::destroyWindow("obj 1");
    cv::destroyWindow("obj 2");

	if (fail > 0)
        logger->warn("  TEST FAILED: setImg()");
    logger->trace("==============================");
	return fail;
}
Пример #9
0
int RGBFilterTEST::T_filter() {
	int fail = 0;
    logger->trace("==============================");

    logger->trace("Testing filter():");

//	logger->trace(" Using imread...");
//	cv::Mat img = cv::imread("rgb_mode_0.jpg",CV_LOAD_IMAGE_COLOR);
//	if (! img.data)
//		logger->warn(" OH NO, img not read");

    logger->trace(" Using camCap...");
    ImgDataTEST* imgTest = new ImgDataTEST();
    cv::Mat img = imgTest->camCap();
	cvDestroyWindow("camCap");
    logger->trace(" Loading test image into a ImgData wrapper...");
    ImgData* testImg = new ImgData("raw",img);
    logger->trace(" Copying ImgData to second wrapper...");
    ImgData* testImg2 = new ImgData(*testImg);
    logger->trace(" Showing one copy of test image (should be named \"raw\")...");
	testImg->showImg();

    logger->trace(" Filtering first data w/ full luminosity specturm, aka mode 0...");
    logger->trace("  Init int arr[3]...");
	int arr[] = {25,-15,-20};
    logger->trace("  Using filter factory, create mode 0 filter...");
	RGBFilter* rgbFilter = new RGBFilter(arr);//(RGBFilter*)FilterFactory::createRGBFilter(arr);
    logger->trace("  Creating filter manager w/ id \"RGBFilter MODE 0\"...");
	FilterManager* fm = new FilterManager("RGBFilter MODE 0");
    logger->trace("  Inserting filter as \"rgb mode 0\"...");
	fm->insertFilter("rgb mode 0",rgbFilter);
    logger->trace("  Attempt filtering using filter manager...");
	fm->applyFilterChain(testImg);
    logger->trace("  Showing filtered test image...");
	testImg->showImg();
    logger->trace("   Expect 2 windows, \"raw\" and \"RGBFilter MODE 0\", the latter should be red shifted");
    logger->trace("   If true, hit space, else hit esc");
	char key;
	while (1) {
		key = cvWaitKey(0);
		if (char(key) == 32) {
            logger->trace("    ok");
				break;
		}
		else if (char(key) == 27) {
            logger->warn("    NOT ok, details of output under mode 0 not correct");
			fail++;
			break;
		}
	}

    logger->trace(" Filtering data 2 w/ 3 zones of luminosity separately, aka mode 1...");
    logger->trace("  Init int high[3],mid[3],shad[3]...");
	int high[] = {255,255,255};
	int mid[] = {50,-30,-30};
	int shad[]	= {-255,-255,-255};
    logger->trace("  Using filter factory, create mode 1 filter...");
	RGBFilter* rgbFilter2 = new RGBFilter(high,mid,shad);//(RGBFilter*)FilterFactory::createRGBFilter(high,mid,shad);
    logger->trace("  Creating filter manager w/ id \"RGBFilter MODE 1\"...");
	FilterManager* fm2 = new FilterManager("RGBFilter MODE 1");
    logger->trace("  Inserting filter as \"rgb mode 1\"...");
	fm2->insertFilter("rgb mode 1",rgbFilter2);
    logger->trace("  Attempt filtering using filter manager...");
	fm2->applyFilterChain(testImg2);
    logger->trace("  Showing filtered test image...");
	testImg2->showImg();
    logger->trace("   Expect 3 windows in total, \"raw\" and \"RGBFilter MODE 0\" and \"RGBFilter MODE 1\", the latter should be red shifted, but a bit differently");
    logger->trace("   If true, hit space, else hit esc");
	while (1) {
		key = cvWaitKey(0);
		if (char(key) == 32) {
            logger->trace("    ok");
				break;
		}
		else if (char(key) == 27) {
            logger->warn("    NOT ok, details of output under mode 1 not correct");
			fail++;
			break;
		}
	}

	delete fm;
	delete fm2;
	cvDestroyWindow("raw");
	testImg->closeImg();
	testImg2->closeImg();
    delete testImg;
    delete testImg2;
    img.release();

	if (fail > 0)
        logger->warn("  TEST FAILED: filter()");
    logger->trace("==============================");
	return fail;
}
Пример #10
0
void BuoyTask::execute() {

    HSVFilter green(std::stoi(settings->getProperty("g1")),
                    std::stoi(settings->getProperty("g2")),
                    std::stoi(settings->getProperty("g3")),
                    std::stoi(settings->getProperty("g4")),
                    std::stoi(settings->getProperty("g5")),
                    std::stoi(settings->getProperty("g6")));

    HSVFilter red(std::stoi(settings->getProperty("r1")),
                  std::stoi(settings->getProperty("r2")),
                  std::stoi(settings->getProperty("r3")),
                  std::stoi(settings->getProperty("r4")),
                  std::stoi(settings->getProperty("r5")),
                  std::stoi(settings->getProperty("r6")));
    //only look for 1 circle
    ShapeFilter sf (2, 1);

    //assuming the sub is in the correct position
    //first look for red, and then hit it
    //then look and hit green

    bool hitGreen = false;
    bool hitRed = false;

    int retreat = 0;
    int moveDist = std::stoi(settings->getProperty("moveDist"));
    int rotateAng = std::stoi(settings->getProperty("rotateAng"));
    int movementDelay = std::stoi(settings->getProperty("movementDelay"));
    int deltaDist = 0;
    float deltaT = 0;

    bool done = false;

    while (!done) {
        std::string s = "raw";
        ImgData* data = dynamic_cast<ImgData*>
                (dynamic_cast<CameraState*>
                 (camModel->getState())->getDeepState(s));
        imgWidth = data->getImg().size().width;
        imgHeight = data->getImg().size().height;
//        cv::imshow("hsv",data->getImg());

        //filter for a color depending if the other color is hit or not
        if (!hitRed){
            println("Filtering red");
            red.filter(data);
        } else if (!hitGreen){
            //println("Filtering green");
            //green.filter(data);
            done = true;
            continue;
        } else if (hitGreen && hitRed) {
            done = true;
            println("Done task");
            continue;
        }

        //after hitting a color, move the sub back to look for the other one
        //TODO: CALIBRATE THIS STEP

        if (sf.filter(data)){
            retreat = false;
            cv::Point2f cent = sf.getCenter()[0];
            if (std::abs(cent.x - imgWidth/2) < imgWidth/20){
                //in the middle 20% of the screen horizontally
                if (std::abs(cent.y - imgHeight / 2) < imgHeight / 20) {
                    //in the middle 20% vertically
                    float d = calcDistance(sf.getRad()[0]) * 1.2;
                    float t = d/moveSpeed;
                    println("Moving " + std::to_string(d) + "cm in " + std::to_string(t) + "s");
                    move(moveSpeed);
                    usleep(std::stoi(settings->getProperty("MOVE_TIME")));
                    if (!hitRed){
                        hitRed = true;
                        println("Hit red");
                        retreat = true;
                    } else {
                        hitGreen = true;
                        println("Hit green");
                        retreat = true;
                    }
                    logger->info("Stopping");
                    move(0);
                    /*
                    //if the radius of the circle is huge, so the sub will hit it
                    if (sf.getRad()[0] > imgWidth*imgHeight/3){
                        if (!hitGreen){
                            hitGreen = true;
                            println("Hit green");
                        }else{
                            hitRed = true;
                            println("Hit red");
                        }

                        //return the sub back to its orginal position
                        move(0);
                        retreat = true;
                        println("Retreat enabled");
                    }else{
                        //move straight and hit it
                        float dist = calcDistance(sf.getRad()[0]);
                        deltaDist = dist*1.2;
                        println("Moving forward " + std::to_string(deltaDist) + "cm to hit buoy");
                        move(deltaDist);
                    }*/
                } else {
                    float deltaY;
                    if (cent.y > imgHeight/2) {
                        deltaY = -0.1; //rise a bit
                    } else {
                        deltaY = 0.1; //sink a bit
                    }
                    //float deltaY = (cent.y - imgHeight/2)/sf.getRad()[0];
                    println("Rising " + std::to_string(deltaY*100)+"cm");
                    changeDepth(deltaY);
                }
            } else {
                println("Center: " + std::to_string(cent.x) + " " + std::to_string(imgWidth/2));
                //float ang = atan2(cent.x-imgWidth/2, 0) * 180 / M_PI;
                //float dX = cent.x-imgWidth/2;
                //dX * 23/sf.getRad()[0];
                //float ang = atan(dX/calcDistance(sf.getRad()[0])) * 180 / M_PI;
                //println("Rotating " + std::to_string(ang) + " degrees");
                //rotate(ang);
                float dir = cent.x-imgWidth/2;
                println("Rotating 10 degrees " + std::to_string(dir));
                dir /= std::abs(dir);
                rotate (5*dir);
                /*
                float scale = 23/sf.getRad()[0];
                float dist = sf.getCenter()[0].x - imgWidth/2;

                //slide 2/3 of the way
                float deltaX = dist*scale/3*2;
                println("Sliding " + std::to_string(deltaX)+"cm");
                slide(deltaX);*/
            }
        } else {
            ///CIRCLES NOT FOUND
            ///ROTATE/MOVE SUB
            //rotate(rotateAng);
            println("Circle not found, moving forward");
            //move(moveDist);
            if (retreat) {
                if (moveWithSpeed){
                    println("Retreating");
                    move(-moveSpeed);
                    usleep(40000000);
                    //usleep(deltaT * 500);
                    move(0);
                    rotate(-deltaAngle);
                    usleep(5000000);
                } else {
                    println("Retreating " + std::to_string(-deltaDist - 20) + "cm");
                    move(-deltaDist - 20);      //move 20cm more than i needed

                    //sleep(movementDelay);
                    //move the sub back to the middle
                    if (deltaAngle != -1){
                        println("Retreat rotating " + std::to_string(deltaAngle) + " degrees");
                        rotate(deltaAngle);
                        println("Retreat to middle by " + std::to_string(deltaDist-20) + "cm");
                        move (deltaDist-20);   //move 20cm less than i need
                        rotate(-deltaAngle);
                    }
                }
                retreat = false;
//                continue;
            } else {
                ///tries to look for any colors and move towards it
                logger->info("Looking for coloured masses to turn towards");
                std::vector<cv::Point2f> mc = sf.findMassCenter(data);
                if (mc.size() > 0) {
                    logger->info("Found coloured mass");
                    float dir = mc[0].x - imgWidth/2;
                    dir /= std::abs(dir);
                    rotate(5 * dir);
                } else {
                    ///if it dosnt see any colors, move forwards
                    logger->debug("No coloured masses found.  Moving forward");
                    move(moveSpeed);
                }
            }
        }
        delete data;
        data = 0;
        usleep(33000);
    }
}
Пример #11
0
bool LineFilter::filter(Data *data){
    // check for whether the input is of the correct type.          From Albert
    ImgData* imgData = dynamic_cast<ImgData*>(data);
    if (imgData == 0) {
        // track the error and return error
        this->track(data,this->filterID,1,1);
        return false;
    }
    cv::imshow("asdf", filter(imgData->getImg().clone(),0));

    //begin filter sequence
    int linesFound = 0;
    cv::Mat src = imgData->getImg();
    cv::Mat dst;
    cv::Mat cdst = src.clone();
    Canny(src, dst, 50, 200, 3);
    cvtColor(dst, cdst, CV_GRAY2BGR);

    std::vector<cv::Vec2f> lines;
    //detects lines
    HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );
    //ending filter sequence

    //calculating the line equation
    linesEq.clear();
    float x1 = 0, x2 = 0, y1 = 0, y2 = 0;
    for( size_t i = 0; i < lines.size(); i++ ){
        float rho = lines[i][0], theta = lines[i][1];
        cv::Point pt1, pt2;
        double a = cos(theta), b = sin(theta);
        double x0 = a*rho, y0 = b*rho;
        pt1.x = cvRound(x0 + 1000*(-b));
        pt1.y = cvRound(y0 + 1000*(a));
        pt2.x = cvRound(x0 - 1000*(-b));
        pt2.y = cvRound(y0 - 1000*(a));

        x1 = pt1.x;
        y1 = pt1.y;
        x2 = pt2.x;
        y2 = pt2.y;
        //equation of line
        std::vector<float> eq;

        //y = mx+b
        //B MIGHT BE USELSES, NEED FURTHER TESTING
        bool safeMath = true;
        float M = 0, B = 0;
        if (x2-x1 < 5){     //straight line
            safeMath = false;
            M = INFINITY;
            B = INFINITY;
        }
        if (safeMath){      //avoid div by 0 error
            //M = (y2-y1) / (x2-x1);
            double realtheta = (rho < 0)? theta - M_PI:theta;
            realtheta = -realtheta +  M_PI/2;
            M = tan(realtheta);
            B = y2 - M*x2;
        }

        bool repeat = false;
        //check if there is a similar line already
        for (std::vector<float> lines: linesEq){
            //vert line situations
            if (M == INFINITY && lines[0] == INFINITY){
                //check their x values
                if (std::abs(lines[2] - ((x1+x2)/2)) < maxDiff){
                    repeat = true;
                    break;
                }
            }
            //check if m is almost vertical
            else if (std::abs(M) > maxSlope && lines[0] == INFINITY){
                //std::cout<<"almost vert ";
                //std::cout<<std::abs(lines[2] - ((x1+x2)/2))<<std::endl;
                if (std::abs(lines[2] - ((x1+x2)/2) ) < maxDiff){
                    repeat = true;
                    break;
                }
            }
            else if (M == INFINITY && std::abs(lines[0])> maxSlope){
                //std::cout<<"almost vert II ";
                //std::cout<<std::abs(lines[2] - ((x1+x2)/2))<<std::endl;
                if (std::abs(lines[2] - ((x1+x2)/2) ) < maxDiff){
                    repeat = true;
                    break;
                }
            }
            //check if m is too similar or not, b is too different to check
            else if (std::abs(lines[0] - M) < maxDiff){
                if (M > 15){ //vertical lines
                    //check if the intersection point is near the average x
                    if (std::abs((B-lines[1])/(lines[0]-M))-(x1+x2)/2 < maxDiff){
                        repeat = true;
                        break;
                    }
                }else{      //horziontal lines
                    if (std::abs((B-lines[1])/(lines[0]-M))*M - (y1+y2)/2 < maxDiff){
                        repeat = true;
                        break;
                    }
                }
            }
        }

        if (!repeat){
            eq.push_back(M);
            eq.push_back(B);
            //std::cout<<M<<" "<<B<<" " << ((x1+x2)/2) << " ";
            if (std::abs(M) < 5){  //aprox horizontal line
                eq.push_back(y2);   //give it the y value
                //std::cout<<y2;
                //printf(" horz line");
            }
            if (std::abs(M) > maxSlope){ //vertical line
                eq.push_back(x2);   //x value
                //std::cout<<x2;
                //printf(" vertal line");
            }
            //std::cout<<std::endl;

            linesEq.push_back(eq);
            linesFound++;
            //line(*cdst, pt1, pt2, cv::Scalar(0,0,255), 3, CV_AA);     //drawing the line
        }
    }

    //should i set imgData to something?? -Carl

    //track and return
    this->track(imgData, this->filterID, 0,0);
    //println(linesFound != 0);
    return linesFound != 0;
}
Пример #12
0
bool RGBFilter::filter(Data* data) {
	// check for whether the input is of the correct type.
	ImgData* cast = dynamic_cast<ImgData*>(data);
	if (cast == 0) {
		// track the error and return error
		this->track(data,this->filterID,1,1);
        return false;
	}

    if (cast->img.type() != 16) {
		this->track(data,this->filterID,2,1);
        return false;
	}

	// begin filter sequence.
	int newPixelVal;
    cv::Mat src = cast->getImg();
    cv::Mat filteredImg = src.clone();
	cv::Mat BGR[3];

	cv::split(filteredImg,BGR);
	// catch error?

	// Full spectrum mode
	if(this->mode == 0) {
        for(int y = 0; y < src.cols; y++ ) {
            for(int x = 0; x < src.rows; x++ ) {
				for(int c = 0; c < 3; c++) {
                    newPixelVal = std::max(0,std::min(mxColour,BGR[c].at<unsigned char>(x,y) + midMult[c]*midtone[c]));
					BGR[c].at<unsigned char>(x,y) = newPixelVal;
				}
			}
		}
	}

	// 3 zone mode
	if (this->mode == 1) {
		int luminosity;
        const int SHADTHRESHOLD = (int) mxColour*10/3;
		const int HIGHTHRESHOLD = SHADTHRESHOLD * 2;
		// get luminosity with some function
		// use luminosity as a switch for case using high, mid or shad
        for(int y = 0; y < src.cols; y++ ) {
            for(int x = 0; x < src.rows; x++ ) {
				// From 11%,59%,30% bgr respectively. Scaled to 1:6:3 factors
				// luminosity range is from 0-2550, 1/3 is 850. Calc this from:
				// 10*255, 10* MXCOLOR
				luminosity = BGR[0].at<unsigned char>(x,y)*1+BGR[1].at<unsigned char>(x,y)*6+BGR[2].at<unsigned char>(x,y)*3;

				for(int c = 0; c < 3; c++) {

					if (luminosity < SHADTHRESHOLD)
                        newPixelVal = std::max(0,std::min(mxColour,BGR[c].at<unsigned char>(x,y) + shadMult[c]*shadow[c]));
					else if (luminosity > HIGHTHRESHOLD)
                        newPixelVal = std::max(0,std::min(mxColour,BGR[c].at<unsigned char>(x,y) + highMult[c]*highlight[c]));
					else
                        newPixelVal = std::max(0,std::min(mxColour,BGR[c].at<unsigned char>(x,y) + midMult[c]*midtone[c]));

					BGR[c].at<unsigned char>(x,y) = newPixelVal;
				}
			}
		}
	}

	//joining seq
	cv::merge(BGR,3,filteredImg);

	//set sequence
    cast->setImg(filteredImg);

	// end sequence.

	// track and return
	this->track(cast,this->filterID,0,0);
    return true;
}