/*! * @brief メソッドImageProcessing::showTogetherImage().2つのcv::Matを1つのウインドウに表示 * @param cv::Mat& image1, cv::Mat& image2 */ void ImageProcessing::showImageTogether(Mat& image1, Mat& image2) { //ウインドウ名と合成画像を定義 char* window_name = "処理結果"; int win_width = image1.cols + image2.cols; int win_height = max(image1.rows, image2.rows); //ウインドウの高さは高い方に合わせる Mat all_img(Size(win_width, win_height), CV_8UC3); //画像を合成 Mat roi1(all_img, Rect(0, 0, image1.cols, image1.rows)); Mat roi2(all_img, Rect(image1.cols, 0, image2.cols, image2.rows)); image1.copyTo(roi1); image2.copyTo(roi2); showImage(window_name, all_img); //合成した画像を表示 return; }
static bool convolve_dft(InputArray _image, InputArray _templ, OutputArray _result) { ConvolveBuf buf; CV_Assert(_image.type() == CV_32F); CV_Assert(_templ.type() == CV_32F); buf.create(_image.size(), _templ.size()); _result.create(buf.result_size, CV_32F); UMat image = _image.getUMat(); UMat templ = _templ.getUMat(); UMat result = _result.getUMat(); Size& block_size = buf.block_size; Size& dft_size = buf.dft_size; UMat& image_block = buf.image_block; UMat& templ_block = buf.templ_block; UMat& result_data = buf.result_data; UMat& image_spect = buf.image_spect; UMat& templ_spect = buf.templ_spect; UMat& result_spect = buf.result_spect; UMat templ_roi = templ; copyMakeBorder(templ_roi, templ_block, 0, templ_block.rows - templ_roi.rows, 0, templ_block.cols - templ_roi.cols, BORDER_ISOLATED); dft(templ_block, templ_spect, 0, templ.rows); // Process all blocks of the result matrix for (int y = 0; y < result.rows; y += block_size.height) { for (int x = 0; x < result.cols; x += block_size.width) { Size image_roi_size(std::min(x + dft_size.width, image.cols) - x, std::min(y + dft_size.height, image.rows) - y); Rect roi0(x, y, image_roi_size.width, image_roi_size.height); UMat image_roi(image, roi0); copyMakeBorder(image_roi, image_block, 0, image_block.rows - image_roi.rows, 0, image_block.cols - image_roi.cols, BORDER_ISOLATED); dft(image_block, image_spect, 0); mulSpectrums(image_spect, templ_spect, result_spect, 0, true); dft(result_spect, result_data, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE); Size result_roi_size(std::min(x + block_size.width, result.cols) - x, std::min(y + block_size.height, result.rows) - y); Rect roi1(x, y, result_roi_size.width, result_roi_size.height); Rect roi2(0, 0, result_roi_size.width, result_roi_size.height); UMat result_roi(result, roi1); UMat result_block(result_data, roi2); result_block.copyTo(result_roi); } } return true; }
void *image_show( void *) /*analiza imagem*/ { Mat frameCopy; Mat frameAnalize; Mat result; Point alvo; timer timer_image_show; mouseInfo.event=-1; sleep(1); while(1) { timer_image_show.a(); pthread_mutex_lock(&in_frame); frameCopy=frame; pthread_mutex_unlock(&in_frame); if(mouseInfo.x > 26 && mouseInfo.y >26 && mouseInfo.event==EVENT_LBUTTONDOWN) { Cerro; printf("Change! \n"); Rect myDim(mouseInfo.x-25,mouseInfo.y-25, 50, 50); frameAnalize = frameCopy(myDim).clone(); frameAnalize.copyTo(frameAnalize); } else if(mouseInfo.event == -1) { Rect myDim(frameCopy.cols/2,frameCopy.rows/2, 50, 50); frameAnalize = frameCopy(myDim); frameAnalize.copyTo(frameAnalize); mouseInfo.event=-2; } /// Create the result matrix int result_cols = frameCopy.cols - frameAnalize.cols + 1; int result_rows = frameCopy.rows - frameAnalize.rows + 1; result.create( result_cols, result_rows, CV_32FC1 ); /// Do the Matching and Normalize int match_method=1; //1-5 matchTemplate( frameCopy, frameAnalize, result, match_method ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); /// Localizing the best match with minMaxLoc double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); /// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ) { matchLoc = minLoc; } else { matchLoc = maxLoc; } /// make retangles rectangle( frameCopy, matchLoc, Point( matchLoc.x + frameAnalize.cols , matchLoc.y + frameAnalize.rows ), Scalar::all(0), 2, 8, 0 ); rectangle( result, matchLoc, Point( matchLoc.x + frameAnalize.cols , matchLoc.y + frameAnalize.rows ), Scalar::all(0), 2, 8, 0 ); /// make a dif with the original and the matched Rect myDim2(matchLoc.x,matchLoc.y,50 , 50); Mat frameAnalizado = frameCopy(myDim2).clone(); // Mat subt = frameAnalize - frameAnalizado; // Translate matchCoord to Point alvo.x=matchLoc.x+25; alvo.y=matchLoc.y+25; /// Make a simple text to debug char str[256]; sprintf(str, "x:%d/y:%d", alvo.x, alvo.y); putText(frameCopy, str, cvPoint(30,30), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,0,250), 1, CV_AA); sprintf(str, "maxVal:%.8f/minVal:%.8f", maxVal, minVal); putText(frameCopy, str, cvPoint(30,60), FONT_HERSHEY_COMPLEX_SMALL, 0.6, cvScalar(200,0,250), 1, CV_AA); //draw lines //pthread_mutex_lock(&in_window); line(frameCopy, Point (0,alvo.y), Point (frameCopy.cols,alvo.y), cvScalar(200,200,250), 1, 8, 0); line(frameCopy, Point (alvo.x,0), Point (alvo.x,frameCopy.rows), cvScalar(200,200,250), 1, 8, 0); //line(frameCopy, Point (0,0), Point (frameCopy.cols,frameCopy.rows), cvScalar(200,200,250), 1, 8, 0); /// cut the image to make something more.... cool Rect roi1( Point( frameCopy.cols-50, 0 ), frameAnalize.size() ); frameAnalize.copyTo( frameCopy( roi1 ) ); Rect roi2( Point( frameCopy.cols-50, 50 ), frameAnalize.size() ); frameAnalizado.copyTo( frameCopy( roi2 ) ); imshow("image_show",frameCopy); namedWindow("image_show", CV_WINDOW_NORMAL); setMouseCallback("image_show", CallBackFunc, NULL); //imshow("analize",frameAnalize); //namedWindow("analize", CV_WINDOW_NORMAL); //imshow("result",result); //namedWindow("result", CV_WINDOW_NORMAL); //imshow("analizado",frameAnalizado); //namedWindow("analizado", CV_WINDOW_NORMAL); waitKey(30); //imshow("sub",subt); //namedWindow("sub", CV_WINDOW_NORMAL); Caviso; printf("Fps do streaming: %.2f\n",1/timer_image_show.b()); //end_fps(); Caviso; printf("tempo de image_show: %f s \n",timer_image_show.b()); waitKey(30); //pthread_mutex_unlock(&in_window); } Cerro; printf("Image_show Down !\n"); return NULL; }