WatermarkNode( const std::string & input, const std::string & output, const std::string & text, const std::string & node_name = "watermark_node") : Node(node_name, true) { auto qos = rmw_qos_profile_sensor_data; // Create a publisher on the input topic. pub_ = this->create_publisher<sensor_msgs::msg::Image>(output, qos); std::weak_ptr<std::remove_pointer<decltype(pub_.get())>::type> captured_pub = pub_; // Create a subscription on the output topic. sub_ = this->create_subscription<sensor_msgs::msg::Image>( input, [captured_pub, text](sensor_msgs::msg::Image::UniquePtr msg) { auto pub_ptr = captured_pub.lock(); if (!pub_ptr) { return; } // Create a cv::Mat from the image message (without copying). cv::Mat cv_mat( msg->width, msg->height, encoding2mat_type(msg->encoding), msg->data.data()); // Annotate the image with the pid, pointer address, and the watermark text. std::stringstream ss; ss << "pid: " << GETPID() << ", ptr: " << msg.get() << " " << text; draw_on_image(cv_mat, ss.str(), 40); pub_ptr->publish(msg); // Publish it along. }, qos); }
// the function the thread will run when it is called void ProcessingThread::run() { while(1) { ///////////////////////////////// // Stop thread if stopped=TRUE // ///////////////////////////////// stoppedMutex.lock(); if (stopped) { stopped=false; stoppedMutex.unlock(); break; } stoppedMutex.unlock(); ///////////////////////////////// ///////////////////////////////// // Save processing time processingTime=t.elapsed(); // Start timer (used to calculate processing rate) t.start(); // Get frame from queue Mat currentFrame=imageBuffer->getFrame(); // Make copy of current frame (processing will be performed on this copy) currentFrame.copyTo(currentFrameCopy); // Set ROI of currentFrameCopy currentFrameCopy.locateROI(frameSize,framePoint); currentFrameCopy.adjustROI(-currentROI.y,-(frameSize.height-currentROI.height-currentROI.y), -currentROI.x,-(frameSize.width-currentROI.width-currentROI.x)); updateMembersMutex.lock(); updateMembersMutex.unlock(); // Update statistics updateFPS(processingTime); currentSizeOfBuffer=imageBuffer->getSizeOfImageBuffer(); if (decideToProcess()){ writeHistory(); // set the black level if (SetBlackFlag == 1){ blackVal = setBlackCalib(currentFrame); SetBlackFlag = 0; } process(¤tFrame); } draw_on_image(GameState.table, ¤tFrameCopy); frame=MatToQImage(currentFrameCopy); emit newFrame(frame); //printTest(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } qDebug() << "Stopping processing thread..."; }
/* **slide\_title\_in()**, **slide\_title\_out()** and * **bling\_title()** are used by the level * timeline to animate the title. * * We use cosine interpolation to slide the title in * and out, creating a smoother effect. * * **progress** will hold a value between 0 to 1 * based on the event progess/duration, making it ideal * for use with interpolation functions. */ static void* before_title_in(void* data, float elapsed_ms, float progress) { struct rectangle c = { 0, 0, 192, 108 }; struct rectangle r = { 0, 0, 64, 64 }; struct level_data* ldata = data; UNUSED(elapsed_ms); UNUSED(progress); clear_image(ldata->title.mask, color_from_RGB(0, 0, 0)); draw_on_image(ldata->title.mask); draw_image(ldata->title.spot, -15, 40, &r, 0); draw_on_screen(); draw_image(ldata->title.mask, 0, 0, &c, 0); return NULL; }
static void* slide_title_in(void* data, float elapsed_ms, float progress) { struct rectangle c = { 0, 0, 192, 108 }; struct rectangle r = { 0, 0, 64, 64 }; struct level_data* ldata = data; UNUSED(elapsed_ms); clear_image(ldata->title.mask, color_from_RGB(255 * progress, 255 * progress, 255 * progress)); draw_on_image(ldata->title.mask); draw_image(ldata->title.spot, -15, 40, &r, 0); draw_on_screen(); draw_image(ldata->title.mask, 0, 0, &c, 0); draw_sprite(ldata->title.sprite, interpolate(-100, 20, progress, circular_ease_out), 10); return NULL; }
int main(int argc, char** argv) { static const char* names[] = { "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0000.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0001.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0001.bmp", // bad "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0003.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0004.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0005.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0006.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0007.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0008.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0009.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0010.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0011.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0012.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0013.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0014.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0015.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0016.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0017.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0018.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0019.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0020.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0021.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0022.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0023.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0024.bmp", "D:\\Adi\\blackjack\\avacam\\CamSnapShots\\Cam0025.bmp", 0 }; IplImage * Glyphs[13]; IpVec keypoints[13]; preLoadGlyphs(Glyphs ,keypoints); gameTable oldTable; oldTable.numCards = 0; for( int i = 0; i<100 != 0; i++ ) { Mat image = imread(names[0+i%25], 1); if( image.empty() ) { printf("%s%d","\n couldnt load frame num: ",i); continue; } //imshow("table - read", image); gameTable Table; getTableFromMat(& Table, &image); printf("%s%d","\n frame num: ",i); fill_known_cards(&Table,&oldTable,image,Glyphs, keypoints,70,20); //play with the nums draw_on_image(Table,image); for (int i=0; i<Table.players.size() ; i++) { printf("%s%d","\n hand number: ",i); for (int j=0; j<Table.players[i].cards.size() ; j++) { printf("%s%d%s%c","\n card: ",j," is:",Table.players[i].cards[j].value); } } char c = waitKey(20); if( (char)c == 27 ) break; oldTable = Table; } return 0; }