ကွန်ပျူတာကDataတွေကိုဂဏန်းတွေအဖြစ်မြင်ထားပြီးလိုအပ်တဲ့တွက်ချက်မှုတွေလုပ်၊ဆောင်ရွက်ပါတယ်။图像ကို张量အဖြစ်ကွန်ပျူတာကကိန်းဂဏန်းတွေနဲ့မြင်ပါတယ်။မေထရစ်တင်ဆာတွေအဖြစ်သတ်မှတ်ထားလို့သင်္ချာပစ္စည်း张量运算တွေကိုလည်းကောင်းကောင်းလုပ်နိုင်ပါတယ်။မေထရစ်တစ်ခုကိုအခြားမေထရစ်သို့မဟုတ်ဂဏန်းတန်ဖိုးတခုခုနဲ့ပေါင်း၊နုတ်၊မြှောက်၊စားစသဖြင့်运营တွေလုပ်ရင်မူလမေထရစ်ကနေတန်ဖိုးတွေပြောင်းသွားပါတယ်။图像တွေလည်းမေထရစ်တင်ဆာပဲဖြစ်တာကြောင့်အလားတူပါပဲ။တန်ဖိုးတွေပြောင်းသွားမှာပါ။ဓါတ်ပုံရဲ့စိုပြေမှုကစလို့အရွယ်အစား၊အတည့်၊အစောင်းပမာဏတွေကအစပြောင်းလဲနိုင်ပါတယ်။ကျွန်တော်တို့ကနေ့ဆွေးနွေးမယ့်အကြောင်းအရာကတော့အဲဒီလိုပြောင်းလဲတဲ့几何变换အကြောင်းဖြစ်ပါတယ်။
意象翻译
ပထမဆုံးဆွေးနွေးရမယ့်Geometry Transformဖြစ်ပါတယ်။အခြေခံအကျဆုံးလည်းဖြစ်ပါတယ်။ImageထဲကObjectတွေကိုနေရာရွှေ့တာသပ်သပ်ပါပဲ။Point P(x,y)နေရာမှာရှိနေတဲ့ဝတ္ထု(မူရင်း(x,y)နဲ့图像)ကိုP‘(x’,y‘)နေရာရောက်အောင်tx,tyစီရွှေ့လိုက်မှာဖြစ်ပါတယ်။
အထက်ပါပုံကိုကြည့်မယ်ဆိုရင်ဓါတ်ပုံထဲက像素တွေ对象တွေကိုဘယ်နေရာဖြစ်ဖြစ်变换矩阵Mသုံးပြီးရွှေ့နိုင်တယ်ဆိုတာသိသာပါတယ်။
opencvမှာတော့cv2.warpAffine函数ကိုအသုံးပြုလို့ရပါတယ်။
cv.warpAffine(src,M,dsize[,dst[,flag[,borderMode[,borderValue])
SRC命令:输入图像
M:变换矩阵
DSIZE:输出图像的大小
标志1:သုံးမယ့်插值法
ဥပမာမှာဆိုရင်OpenCV徽标ကိုxဝင်ရိုးအားဖြင့်100点,yဝင်ရိုးအားဖြင့်50点ရွှေ့လိုက်တာဖြစ်ပါတယ်။ရလဒ်ကိုကြည့်ပါ။
旋转
平移လိုမျိုးပါပဲ။မူရင်းပုံကို变换矩阵Mနဲ့မြှောက်ပြီးသဏ္ဍာန်နေရာပြောင်းလဲစေ(ရလဒ်အသစ်ရစေ)မှာဖြစ်ပါတယ်။ဒီတခါမြှောက်မယ့်Mကတော့旋转矩阵ဖြစ်ပါတယ်။ပုံကိုလှည့်မှာစောင်းမှာပါ။လှည့်မယ်ဆိုတော့角度ထောင့်တွေလည်းထည့်စဉ်းစားရမယ့်အထဲပါလာပါပြီ။
ပုံမှာပြထားတဲ့O(x0,y0)နေရာဟာ旋转中心ဖြစ်ပါတယ်။အဲဒီအမှတ်ကိုဗဟိုပြုပြီးရုပ်ပုံကိုလှည့်မှာပါ။မူလလှည့်ချင်တဲ့နေရာကP(x,y)ကနေP‘(x’,Y‘)ကိုရောက်စေချင်တာပါ။Center of Rotationနဲ့နဂိုPoint Pကြားထောင့်ကနေ၊Pနဲ့P’ကြားကြားထောင့်θပမာဏကိုလှည့်စေချင်တာဖြစ်ပါတယ်။အထက်ပါပုံမှာပြထားသလို变换矩阵MမှာPကနေP‘ရောက်အောင်လှည့်ချင်တဲ့ကြားထောင့်ပမာဏθထည့်ပြီးတွက်လိုက်ရင်အသစ်ရလာမယ့်(x’,Y‘)点တွေကိုရမှာဖြစ်ပါတယ်။ပုံကလည်းတမျိုးတဖုံပြောင်းသွားမှာပါ။
OpenCVမှာတော့Mအတွက်旋转矩阵ရဖို့cv2.getRotationMatrix2D函数ကိုအသုံးပြုရပါတယ်။
cv2.getRotationMatrix2D(中心,角度,比例)
中心位置:旋转的中心
角度:旋转角度θ(以度为单位)(+veတန်ဖိုးတွေထည့်ရင်计数器顺时针လည်မယ့်ထောင့်ပမာဏဖြစ်ပါတယ်။)
缩放比例:图像ကိုကြီးမလားသေးမလားမူရင်းအတိုင်းပဲလှည့်မလားဆိုတဲ့因子ဖြစ်ပါတယ်။Defaultကတော့1ပါပဲ။(Defaultကမူရင်းအတိုင်းပဲလှည့်မှာဖြစ်ပါတယ်။)
ရလာတဲ့矩阵Mကိုမှcv2.warp仿射函数မှာအထက်ကလိုထည့်သွင်းအသုံးပြုလို့ရပါတယ်။
အထက်ကဥပမာမှာဆိုရင်OpenCV徽标ကိုပဲ图像ရဲ့အလယ်တည့်တည့်ကို旋转中心အဖြစ်ယူပြီး逆时针90°လှည့်ထားတာဖြစ်ပါတယ်။မူရင်းအရွယ်အစားအတိုင်းပဲလှည့်ပါတယ်။
仿射变换
အထက်ပါပုံကိုကြည့်ပါ။အိမ်လေး၃လုံးကိုတွေ့ရပါလိမ့်မယ်။စောင်းပြီးမညီနေတဲ့ပုံကိုပြန်ပြီးညီအောင်ညှိလိုက်တာဖြစ်ပါတယ်။အဲဒီလိုညီအောင်ညှိဖို့(x,y)ကနေ(x‘,y’)အပြောင်းမှာပြောင်းလဲသွားတဲ့အမှတ်၃မှတ်ကိုသိဖို့လိုအပ်ပါတယ်။
အဲဒီအမှတ်၃မှတ်ပါတဲ့变换矩阵ကိုရှာရမှာပါ။မူရင်း坐标(x,y)ကိုအမှတ်၃မှတ်နဲ့ထည့်တွက်လိုက်ရင်ပြောင်းလဲသွားတဲ့(x‘,y‘)ကိုပြန်ရမှာပါ။ကျနော်တို့ကနဂို(x,y)ရောပြောင်းလဲသွားလိုတဲ့(x’,y‘)ရောသိပြီးဒီအမှတ်၃မှတ်ကိုသိဖို့ပြန်တွက်ရမှာဖြစ်ပါတယ်။အမှတ်၃မှတ်ကိုပြန်တွက်ပြီးပြီဆိုတဲ့အချိန်ကျကျနော်တို့ရဲ့(x,y)ကပုံ(x‘,y’)မှာဘယ်လိုအနေအထားမျိုးရှိမလဲဆိုတာimshowနဲ့ထုတ်ကြည့်လို့ရပါပြီ။
openCVမာဒီအမှတ်၃မှတ်ပါတဲ့矩阵Mကိုရှာဖို့အတွက်cv2.getAffineTransform函数ကိုအသုံးပြုနိုင်ပါတယ်။
cv2.getAffineTransform(src,dst)
源imgရဲ့坐标
dst:ရစေချတဲ့imgရဲ့坐标
ရပြီးမှcv2.warpAddineပြန်သုံးလိုက်ရင်Resultထွက်မယ့်ပုံကိုပြလို့ရပါတယ်။
ဥပမာမှာပုံကို坐标系အသစ်နဲ့ပြောင်းပြန်翻转လုပ်ပြထားပါတယ်။
Flipဆိုကာမှcv2.翻转(源,模式)လည်းရှိပါတယ်။源ကပြောင်းချင်တဲ့图像ဖြစ်ပြီး模式မှာ1ဆို水平,垂直0ဆို, -1\f25ဆို၂မျိုးလုံးတပြိုင်နက်Flipပေးမှာဖြစ်ပါတယ်။
ကနေ့အတွက်တော့အသုံးများပြီးသဘောတရားကြားဖူးစေချင်တဲ့变换ပုံစံတွေကိုမိတ်ဆက်ပေးခဲ့တာပါ။တခြား几何运算符တွေအကြောင်းနဲ့透视变换အကြောင်းကိုနောက်ပိုင်း博客တွေမှာအလျဉ်းသင့်သလိုဆက်လက်ဆွေးနွေးသွားပါမယ်။ကျေးဇူးတင်ပါတယ်ခင်ဗျာ။
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/08/04/%e6%95%b0%e5%ad%97%e5%9b%be%e5%83%8f%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86/