2011-03-03 57 views
17

Tôi đang sử dụng opencv 2.1. Trong mã của tôi, tôi có một vài hình ảnh được lưu trữ như các đối tượng Mat khởi tạo như thế này:Cách che phủ văn bản trên ảnh khi làm việc với cv :: Loại Mat

Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE); 

tôi có thể hiển thị chúng đúng cách sử dụng imshow() sau khi hoạt động ma trận của tôi được thực hiện. Bây giờ tôi muốn thêm một số văn bản trên hình ảnh để mô tả những gì đã xảy ra. Nhìn vào tài liệu có vẻ như cvPutText() sẽ là hàm tôi cần. Nhưng khi tôi thử một cái gì đó như thế này:

cvPutText(result, "Differencing the two images.", cvPoint(30,30), &font, GREEN);

tôi nhận được lỗi biên dịch sau: error: cannot convert ‘cv::Mat’ to ‘CvArr*’ for argument ‘1’ to ‘void cvPutText(CvArr*, const char*, CvPoint, const CvFont*, CvScalar)’

gì tôi cần phải làm để có thể thêm một số văn bản khi hiển thị hình ảnh này?

Trả lời

50

Tôi đã xem sai địa điểm. Tôi đã tìm thấy câu trả lời trong OpenCV documentation for cpp mới hơn. Có một hàm mới gọi là putText() chấp nhận các đối tượng cv :: Mat. Vì vậy, tôi đã thử dòng này và nó hoạt động:

putText(result, "Differencing the two images.", cvPoint(30,30), 
    FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA); 

Hy vọng điều này sẽ giúp ai đó.

+1

Thật không may, điều này chỉ hoạt động cho các ký tự ASCII… Nếu ai đó có giải pháp tốt hơn, tôi sẽ lấy nó! –

+1

@ Eliyahu-Shmuel đó là 'putText' không phải là 'PutText'. Tôi sử dụng nó như vậy 'cv :: putText' – nmante

+0

Nó không in tôi bất cứ điều gì trên hình ảnh của tôi. mã của tôi: Mat fre = imread ("1.jpg", 0); \t putText (fre, "Differencing the two images.", CvPoint (30, 30), \t \t FONT_HERSHEY_COMPLEX_SMALL, 0,8, cvScalar (200, 200, 250), 1, CV_AA); –

8
putText(result, "Differencing the two images.", cvPoint(30,30), 
    FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(200,200,250), 1, CV_AA); 

Trong dòng trên "kết quả" phải là cvArr * hoặc IplImage *. nhưng từ mã được cung cấp ở đây, tôi đoán bạn đang đi qua một đối tượng cv :: Mat. Vì vậy, bạn cần phải chuyển đổi nó bằng cách sử dụng cvarrToMat() hoặc vượt qua kết quả & thay vì kết quả.

Hy vọng điều này sẽ giúp

+0

Tốt bắt, tôi không biết về chuyển đổi này - Tôi đã sử dụng nó với một đối tượng Mat mà không thành công. – agodinhost

2

Bạn cũng có thể thực hiện thao tác sau để in văn bản và các biến.

std::ostringstream str; 
    str << "Here is some text:" << myVariable; 
    cv::putText(image, cv::Point(10,10), str.str(), CV_FONT_HERSHEY_PLAIN, CV_RGB(0,0,250)); 
+0

Điều này có vẻ không hoạt động. tại sao có 'i' trong vô hướng của bạn? tại sao '<<" Đây ... "bên ngoài dấu ngoặc đơn? Tôi không thể lấy ví dụ này để biên dịch. –

+0

Tôi biết nhà điều hành là gì. Câu trả lời của bạn không biên dịch và bạn không để lại lời giải thích về những gì đang xảy ra. Tôi đã hy vọng bạn sẽ chỉnh sửa câu trả lời của bạn cho một MWE mà thực sự biên dịch. –

+0

Tôi đã cập nhật câu trả lời. Cảm ơn vì sự đúng đắn của bạn. Quá trình nạp chồng '<<' cần một thư viện khác không phải là một phần của phân phối openCV theo mặc định. – RawMean

-1

putText (img1, "TextString123", cvPoint (50.200), FONT_HERSHEY_SCRIPT_SIMPLEX, 2.5, cvScalar (255,0,0,255), 3, CV_AA);

Bạn có thể tìm thêm thông tin ở đây: http://docs.opencv.org/2.4.9/modules/core/doc/drawing_functions.html

Các diference chính giữa câu trả lời này và câu trả lời từ phía trên là giá trị của tham số 7-ngày, mức độ dày. Với độ dày == 1 chức năng này đã không làm việc cho tôi.

+0

Câu hỏi này đã được trả lời thỏa đáng, vì vậy bạn thực sự cần một chút giải thích để biện minh cho những gì khác biệt/tốt hơn về câu trả lời của bạn. Nó cũng không rõ ràng từ câu trả lời của bạn những gì 'matImg1' là (nó không xuất hiện trong câu hỏi). – DavidW

+0

@DavidW Cảm ơn bạn đã phản hồi. Tôi đã chỉnh sửa câu trả lời của mình. –

+0

Điều này sử dụng giao diện C của openCV (vs C++) thực sự cũ. – RawMean

7

Đối với C++ sử dụng cơ bản:

cv::putText(yourImageMat, 
      "Here is some text", 
      cv::Point(5,5), // Coordinates 
      cv::FONT_HERSHEY_COMPLEX_SMALL, // Font 
      1.0, // Scale. 2.0 = 2x bigger 
      cv::Scalar(255,255,255), // Color 
      1, // Thickness 
      cv::CV_AA); // Anti-alias 

Xem putText() trong tài liệu OpenCV.

1

Một chi tiết khó chịu mà tôi nhìn thấy trong mã thử nghiệm của mình: chú ý vào stament nhập - nó không được hiển thị trong hầu hết các ví dụ và cần phải nhập đúng.

Mã thử nghiệm của tôi chỉ sử dụng mẫu putText ở trên và tôi đã bao gồm imgproc.h giống như tôi đã thực hiện vào một số mã cũ của mình. Các mã biên dịch và liên kết tốt tuy nhiên tôi đã phải đối mặt với một hành vi kỳ lạ với putText (một số rác vào hình ảnh của tôi).

Đó là một PITA cho đến khi tôi tìm ra rằng việc nhập khẩu đã rối tung lên với đời sống xã hội của tôi ...

imageText.cpp

#include "Imaging/imageText.h" 
#include "Commons/xLog.h" 
#include "opencv2/imgproc.hpp" // << Seems to work right? 
using namespace cv; 

namespace imaging 
{ 
    inline Mat image2mat(SmartImage image) NOEXCEPTION 
    { 
     //TODO: hard coded to work only with CV_8UC3, see the other cases ... 
     Mat mat(
     Size(image->WIDTH, image->HEIGHT), 
     CV_8UC3, 
     image->buffer, 
     Mat::AUTO_STEP 
    ); 

     return mat; 
    } 

    inline void _writeText_(SmartImage image, const string TEXT) 
    { 
     Mat mat(image2mat(image)); 

     string text = "Funny text inside the box"; 
     int fontFace = FONT_HERSHEY_SCRIPT_SIMPLEX; 
     double fontScale = 2; 
     int thickness = 3; 
     Point textOrg(10, 130); 
     putText(mat, text, textOrg, fontFace, fontScale, Scalar::all(255), thickness, 8); 
    } 

    const bool writeText(SmartImage image, const string text) NOEXCEPTION 
    { 
     try 
     { 
     _writeText_(image, text); 
     return true; 
     } 
     catch(cv::Exception& e) 
     { 
     LOG_ERROR("writeText OpenCV ERROR: " << e.what() << "!"); 
     } 
     catch(...) 
     { 
     LOG_ERROR("writeText ERROR!"); 
     } 
     return false; 
    } 
} 

Sau đó, tôi chỉ cần thay đổi việc nhập khẩu imgproc trên để

#include <opencv2/opencv.hpp> // << It does includes ALL opencv stuff 

5 cent Mỹ.

Các vấn đề liên quan