**********************
鎿嶄綔鍥惧儚
**********************

.. highlight:: cpp

杈撳叆/杈撳嚭
============

鍥惧儚
------

浠庢枃浠朵腑璇诲叆涓€鍓浘鍍忥細 ::

    Mat img = imread(filename)
    
濡傛灉浣犺鍏ヤ竴涓猨pg鏂囦欢锛岀己鐪佹儏鍐典笅灏嗗垱寤轰竴涓�3閫氶亾鍥惧儚銆傚鏋滀綘闇€瑕佺伆搴︼紙鍗曢€氶亾锛夊浘鍍忥紝浣跨敤濡備笅璇彞锛� ::

    Mat img = imread(filename, 0);

灏嗗浘鍍忎繚瀛樺埌涓€涓枃浠讹細 ::

    Mat img = imwrite(filename);

XML/YAML
--------
    
TBD

鍩烘湰鍥惧儚鎿嶄綔
============================

鑾峰彇鍍忕礌鐨勪寒搴﹀€�
--------------------------------

瑕佽幏鍙栧儚绱犵殑浜害鍊硷紝浣犲繀椤荤煡閬撳浘鍍忕殑绫诲瀷鍜岄€氶亾鐨勬暟鐩€傚涓嬩緥瀛愬睍绀轰簡鑾峰彇鍗曢€氶亾鐏板害鍥撅紙绫诲瀷 8UC1锛夌殑(x, y)浣嶇疆澶勭殑鍍忕礌鍊硷細 ::

    Scalar intensity = img.at<uchar>(x, y);

``intensity.val[0]`` 涓繚瀛樹粠0鍒�255鐨勫€笺€傜幇鍦ㄦ垜浠湅涓€涓�3閫氶亾鍥惧儚濡備綍鑾峰彇鍍忕礌鍊硷紝棰滆壊椤哄簭涓� ``BGR`` 锛� ``imread`` 杩斿洖鐨勭己鐪侀『搴�)锛� ::

    Vec3b intensity = img.at<Vec3b>(x, y);
    uchar blue = intensity.val[0];
    uchar green = intensity.val[1];
    uchar red = intensity.val[2];

浣犲彲浠ヤ娇鐢ㄥ悓鏍风殑鏂规硶澶勭悊娴偣鍥惧儚锛堜緥濡傞€氬涓€涓�3閫氶亾鍥惧儚杩涜Sobel杩愮畻寰楀埌鐨勬诞鐐瑰浘鍍忥級锛� ::

    Vec3f intensity = img.at<Vec3f>(x, y);
    float blue = intensity.val[0];
    float green = intensity.val[1];
    float red = intensity.val[2];

鍚屾牱鐨勬柟娉曚篃鍙敤浜庡儚绱犲€肩殑淇敼锛� ::

    img.at<uchar>(x, y) = 128;

涓€浜汷penCV鍑芥暟锛屼緥濡俢alib3d妯″潡涓殑 ``projectPoints`` 鍑芥暟锛岄渶瑕佷互 ``Mat`` 鐨勬牸寮忚緭鍏ヤ簩缁存垨鑰呬笁缁寸殑鐐广€傝繖鏍风殑鐭╅樀蹇呴』鏈変笖浠呮湁涓€鍒楋紝杩欐牱姣忚瀵瑰簲涓€涓偣锛岀煩闃电被鍨嬮渶瑕佹槸32FC2鎴栬€�32FC3銆傝繖鏍风殑鐭╅樀鍙互寰堝鏄撶殑浠� ``std::vector`` 杞崲鑰屾潵锛� ::

    vector<Point2f> points;
    //... fill the array
    Mat pointsMat = Mat(points);

鎮ㄤ篃鍙互閫氳繃 ``Mat::at`` 鏂规硶鏉ヨ鍐欑煩闃典腑鐨勪竴涓厓绱狅細 ::

    Point2f point = pointsMat.at<Point2f>(i, 0);

鍐呭瓨绠$悊鍜屽弬鑰冭鏁�(reference counting)
----------------------------------------

``Mat`` 鍐呭瓨鍌ㄤ簡鐭╅樀/鍥惧儚鐨勫睘鎬�(琛屾暟锛屽垪鏁帮紝鏁版嵁绫诲瀷绛�)浠ュ強涓€涓寚鍚戞暟鎹殑鎸囬拡銆傚洜姝ゅ嚑涓� ``Mat`` 瀹炰緥鍙互鎸囧悜鍚屼竴涓暟鎹€� ``Mat`` 涓繕璁板綍浜嗗弬鑰冭鏁�(reference count)锛岃繖鏍峰湪 ``Mat`` 琚噴鏀炬椂灏辩煡閬撴槸鍚﹂渶瑕侀噴鏀炬暟鎹€傝繖鍎挎槸涓€涓笉闇€澶嶅埗鏁版嵁灏卞垱寤轰袱涓煩闃电殑渚嬪瓙锛� ::

    std::vector<Point3f> points;
    // .. fill the array
    Mat pointsMat = Mat(points).reshape(1);

杩欐牱鎴戜滑寰楀埌浜嗕竴涓�3鍒楃殑32FC1鐭╅樀锛岃€屼笉鏄�1鍒楃殑32FC3鐭╅樀銆� ``pointsMat`` 浣跨敤 ``points`` 鐨勬暟鎹紝涓斿綋瀹冮噴鏀炬椂涓嶄細鏄惁鏁版嵁銆傚湪杩欎釜渚嬪瓙涓紝寮€鍙戣€呴渶瑕佺煡閬� ``points`` 鐨勭敓鍛芥瘮 ``pointsMat`` 闀裤€傚鏋滄垜浠渶瑕佸鍒舵暟鎹紝閭d箞璇蜂娇鐢� ``Mat::copyTo`` 鎴� ``Mat::clone`` 锛� ::

    Mat img = imread("image.jpg");
    Mat img1 = img.clone();

鍦– API涓紝寮€鍙戣€呭繀椤诲疄鐜板垱寤鸿緭鍑哄浘鍍忕劧鍚庡啀璋冪敤鍑芥暟銆備笌涔嬬浉姣斾笉鍚岀殑鏄疌++ API鏀寔绌虹殑 ``Mat`` 绫诲瀷鐨勮緭鍑哄弬鏁般€侰++ API浼氳皟鐢� ``Mat::create`` 鍒涘缓缁撴灉鐭╅樀銆傚鏋滅煩闃垫槸绌虹殑锛岄偅灏嗕細鐢宠鏁版嵁绌洪棿锛涘鏋滈潪绌猴紝涓斿ぇ灏忓拰绫诲瀷绗﹀悎瑕佹眰锛屽垯璇ュ嚱鏁颁笉鍋氫换浣曚簨鎯咃紱濡傛灉澶у皬鎴栫被鍨嬩笉绗﹀悎瑕佹眰锛屽師鏉ョ殑鏁版嵁浼氳閲婃斁锛岀劧鍚庣敵璇锋柊鐨勬暟鎹┖闂淬€備緥濡傦細 ::

    Mat img = imread("image.jpg");
    Mat sobelx;
    Sobel(img, sobelx, CV_32F, 1, 0);

搴曞眰鎿嶄綔
--------------------

涓虹煩闃靛畾涔変簡涓€绯诲垪鏂逛究鐨勬搷浣滅銆傛垜浠彲浠ュ皢涓€涓凡缁忓瓨鍦ㄧ殑鐏板害鍥惧儚 ``img`` 鍙樻垚鍏ㄩ粦鑹诧細 ::

    img = Scalar(0);

閫夋嫨鎰熷叴瓒e尯鍩燂細 ::

    Rect r(10, 10, 100, 100);
    Mat smallImg = img(r);

灏� ``Mat`` 杞负 C API 鏁版嵁绫诲瀷锛� ::

    Mat img = imread("image.jpg");
    IplImage img1 = img;
    CvMat m = img;

娉ㄦ剰姝ゅ鏃犳暟鎹鍒舵搷浣溿€�

灏嗗僵鑹插浘鍍忚浆涓虹伆搴﹀浘鍍忥細 ::

    Mat img = imread("image.jpg"); // loading a 8UC3 image
    Mat grey;
    cvtColor(img, grey, CV_BGR2GRAY);

灏嗗浘鍍忕殑绫诲瀷浠�8UC1杞负32FC1锛� ::

    src.convertTo(dst, CV_32F);

鏄剧ず鍥惧儚
------------------

鍦ㄧ畻娉曞紑鍙戣繃绋嬩腑锛屾煡鐪嬬畻娉曠殑涓棿缁撴灉鏄潪甯告湁鐢ㄧ殑銆侽penCV鎻愪緵浜嗘柟渚挎煡鐪嬪浘鍍忕殑鏂规硶銆傜被鍨嬩负 ``8U`` 鐨勫浘鍍忓彲浠ヤ娇鐢ㄥ涓嬫柟娉曟樉绀猴細 ::

    Mat img = imread("image.jpg");

    namedWindow("image", CV_WINDOW_AUTOSIZE);
    imshow("image", img);
    waitKey();

璋冪敤 ``waitKey()`` 浼氳繘鍏ヤ竴涓秷鎭惊鐜紝鏉ョ瓑寰� ``image`` 绐楀彛涓婄殑鎸夐敭鍔ㄤ綔銆� 绫诲瀷涓� ``32F`` 鐨勫浘鍍忛渶瑕佽浆涓� ``8U`` 绫诲瀷銆傚涓嬶細 ::

    Mat img = imread("image.jpg");
    Mat grey;
    cvtColor(img, grey, CV_BGR2GREY);

    Mat sobelx;
    Sobel(grey, sobelx, CV_32F, 1, 0);

    double minVal, maxVal;
    minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities
    Mat draw;
    sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal);

    namedWindow("image", CV_WINDOW_AUTOSIZE);
    imshow("image", draw);
    waitKey();

缈昏瘧
======================
浜庝粫鐞� http://www.opencv.org.cn