我正在嘗試創建一個卷積函式,但在訪問內核資料 (cv::Mat) 時遇到了問題。
我創建了 3x3 內核:
cv::Mat krn(3, 3, CV_32FC1);
krn.setTo(1);
krn = krn/9;
我嘗試遍歷它。接下來,imageMat 將是我要應用卷積運算子的影像,輸出將是卷積的結果:
for (int r = 0; r < image.rows - krn.rows; r) {
for (int c = 0; c < image.cols - krn.cols; c) {
int sum = 0;
for (int rs = 0; rs < krn.rows; rs) {
for (int cs = 0; cs < krn.cols; cs) {
sum = krn.data[rs * krn.cols cs] * image.data[(r rs) * image.cols c cs];
}
}
output.data[(r 1)*src.cols c 1]=sum; // assuming 3x3 kernel
}
}
然而,輸出并不理想(只有隨機的黑白像素)。但是,如果我以這種方式更改代碼:
for (int r = 0; r < image.rows - krn.rows; r) {
for (int c = 0; c < image.cols - krn.cols; c) {
int sum = 0;
for (int rs = 0; rs < krn.rows; rs) {
for (int cs = 0; cs < krn.cols; cs) {
sum = 0.11 * image.data[(r rs) * image.cols c cs]; // CHANGE HERE
}
}
output.data[(r 1)*src.cols c 1]=sum; // assuming 3x3 kernel
}
}
使用0.11而不是內核值似乎給出了正確的輸出。出于這個原因,我認為我在訪問內核資料時做錯了。
PS:我不能使用krn.at<float>(rs,cs).
謝謝!
uj5u.com熱心網友回復:
cv::Mat::data是型別的指標uchar。
通過data[y * cols x]訪問存盤的一些位元組float的值krn。要獲得完整的浮點值,請使用at方法模板:
krn.at<float>(rs,cs)
考慮將sum變數型別更改為實數。否則,在計算卷積時可能會丟失部分結果。
因此,如果您不能使用at,只需從資料指標讀取 4 個位元組:
float v = 0.0;
memcpy(&v, krn.data (rs * krn.step cs * sizeof(float)), 4);
step - 表示 mat 中一行占用的總位元組數。
uj5u.com熱心網友回復:
而不是不必要地使用memcpy,您可以只投射指標。我將使用 C 風格的強制轉換,因為為什么不呢。
cv::Mat krn = 1 / (cv::Mat_<float>(3,3) <<
1, 2, 3,
4, 5, 6,
7, 8, 9);
for (int i = 0; i < krn.rows; i = 1)
{
for (int j = 0; j < krn.cols; j = 1)
{
// to see clearly what's happening
uint8_t *byteptr = krn.data krn.step[0] * i krn.step[1] * j;
float *floatptr = (float*) byteptr;
// or in one step:
float *floatptr = (float*) (krn.data krn.step[0] * i krn.step[1] * j);
cout << "krn.at<float>(" << i << "," << j << ") = " << (*floatptr) << endl;
endl;
}
}
krn.at<float>(0,0) = 1
krn.at<float>(0,1) = 0.5
krn.at<float>(0,2) = 0.333333
krn.at<float>(1,0) = 0.25
krn.at<float>(1,1) = 0.2
krn.at<float>(1,2) = 0.166667
krn.at<float>(2,0) = 0.142857
krn.at<float>(2,1) = 0.125
krn.at<float>(2,2) = 0.111111
請注意,指標運算可能并不明顯。如果您有 a uint8_t*,則添加1將其移動一個 uint8_t,如果您有一個float*,則添加1將其移動一個浮點數,即四個位元組。該step[]包含位元組表示的偏移。
有關詳細資訊,請參閱檔案,其中包括有關step[]包含步長/步長的陣列的資訊,以計算給定矩陣索引元組的偏移量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348694.html
下一篇:將RGBA影像轉換為RGB影像
